home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-03 / spbas.zip / SIGPRO.BAS < prev    next >
BASIC Source File  |  1993-07-17  |  93KB  |  3,544 lines

  1. DECLARE SUB DEGHOST ()
  2. DECLARE SUB HARM (A!(), M(), INV(), S!(), ifset, IFERR)
  3. DECLARE SUB DIMTRANSFORM ()
  4. DECLARE SUB MATCHFILTER ()
  5. DECLARE SUB CROSSCORRELATION ()
  6. DECLARE FUNCTION LN! (X!)
  7. DECLARE SUB SEISMO2 (NEWMODEL!)
  8. DECLARE SUB LEASTDELTA (XGET!(), LEAST!)
  9. DECLARE SUB NEWCONV (ISNP!, IGNP!, S!(), G!(), F!(), CON!(), CC())
  10. DECLARE SUB NEWFOLD (IP!, SIG!(), FOLD!())
  11. DECLARE SUB NEWCONVOLUTION ()
  12. DECLARE SUB SEISMOGRAMMENU ()
  13. DECLARE SUB SEISMOGRAM (N)
  14. DECLARE SUB CONTEST ()
  15. DECLARE SUB FOUR1 (DATQ!(), NN!, ISIGN!)
  16. DECLARE SUB REALFT (DATQ!(), N!, ISIGN!)
  17. DECLARE SUB TWOFFT (DATA1!(), DATA2!(), FFT1!(), FFT2!(), N!)
  18. DECLARE SUB CONVOLVE2 (DATQ!(), N!, RESPNS!(), M!, ISIGN!, ANS!())
  19. DECLARE SUB NUMERICALRECIPESMENU ()
  20. DECLARE SUB CONVOLV (N!, NP2!, S!(), G!())
  21. DECLARE SUB SINCLPF (N!, DELT!, F!())
  22. DECLARE SUB CONVOLUTION ()
  23. DECLARE SUB GETFILTER (FILT!(), FREQ!(), NP2!, FSTITLE$, FTTITLE$)
  24. DECLARE SUB BANDPASSFILTER (S(), TIME(), CN(), FREQ(), RA(), IA(), PHI(), NP2)
  25. DECLARE SUB MENUSIGNALPRO ()
  26. DECLARE SUB GETPOWEROFTWO (NP!, M!, NP2!)
  27. DECLARE SUB RESETALL ()
  28. DECLARE SUB GWHILBERT (HILBERTTRANSFORM!(), W!())
  29. DECLARE SUB FOLDANDSHIFT (IP, XY!(), YX!())
  30. DECLARE SUB SCENTER (OLDCOL!, NEWCOL!, LABLE$)
  31. DECLARE SUB NPRINTFORMAT (NUM!, PRNFMT$)
  32. DECLARE SUB IFEVEN (NUM1!, EVENORODD!)
  33. DECLARE SUB NCENTER (ROW!, COLUMN!, NUMBERLABLE!)
  34. DECLARE SUB WAITFORKEY ()
  35. DECLARE SUB NIFDEFAULT (R$, R!, DEFAULTVAL!)
  36. DECLARE SUB FASTFOURIER (INPUTFILE$, INFILENUM!, OUTPUTFILE$, OUTFILENUM!, NP!)
  37. DECLARE SUB FFT (NP!, M, RA!(), IA!())
  38. DECLARE SUB PAGE ()
  39. DECLARE SUB GRAPHTEST ()
  40. DECLARE SUB GRAPH (SCOUNT!(), S!(), DATATOTAL!, XMIN!, XMAX!, YMIN!, YMAX!, PLOTPOINT%, T$, X$, Y$)
  41. DECLARE SUB GETMINMAX (XGET!(), YGET!(), DATACOUNT!, XMIN!, XMAX!, YMIN!, YMAX!)
  42. DECLARE SUB GETARRAYSIZE (INPUTFILE$, INFILENUM!, XDATATOTAL!, YDATATOTAL!)
  43. DECLARE SUB CNLINEAMPSPEC (A, B, C)
  44. DECLARE SUB XYZDATAFROMARRAY (X, Y, XY())
  45. DECLARE SUB GETINPUTFILE (INPUTFILE$, INFILENUM)
  46. DECLARE SUB GETOUTPUTFILE (OUTPUTFILE$, OUTFILENUM)
  47. DECLARE SUB ANOFCOS (A, B, C, D, E)
  48. DECLARE SUB BNOFSIN (A, B, C, D, E)
  49. DECLARE SUB PHASE (A, B, PHI)
  50. 'COMMON SHARED XDATATOTAL, YDATATOTAL, ROWS, COLUMNS
  51. COMMON SHARED INPUTFILE$, OUTPUTFILE$, PAGECOUNT
  52. COMMON SHARED WORKINGDIR$, MAXSUMMATION, MINSUM, FFT2
  53. COMMON SHARED DELTAT, DELTAF, DELTAW, TMAX, FMAX
  54. COMMON SHARED COMMONTITLE$
  55.  
  56. DEL$ = CHR$(127)
  57. PIE$ = CHR$(227)
  58. PHI$ = CHR$(237)
  59. RHO$ = CHR$(235)
  60.  
  61. REM $DYNAMIC
  62.  
  63. REDIM SHARED XYDATA(XDATATOTAL, YDATATOTAL)   'ROWS,COLUMNS
  64. REDIM SHARED XYFOLDED(XDATATOTAL, YDATATOTAL) 'COLUMNS, ROWS
  65. DIM SHARED AMPOFA!(51), AMPOFA2!(51), FOFT!(51), FOFT2!(51)
  66.  
  67. 'SCREEN 12
  68. 'WIDTH 80, 60
  69.  
  70. CONST PI = 3.141593
  71.  
  72. CONST BLACK% = 0
  73. CONST BLUE% = 1
  74. CONST GREEN% = 2
  75. CONST CYAN% = 3
  76. CONST RED% = 4
  77. CONST MAGENTA% = 5
  78. CONST BROWN% = 6
  79. CONST WHITE% = 7
  80. CONST DARKGREY% = 8
  81. CONST LIGHTBLUE% = 9
  82. CONST LIGHTGREEN% = 10
  83. CONST LIGHTCYAN% = 11
  84. CONST LIGHTRED% = 12
  85. CONST LIGHTMAGENTA% = 13
  86. CONST LIGHTYELLOW% = 14
  87. CONST BRIGHTWHITE% = 15
  88.  
  89. CONST FALSE = 0, TRUE = NOT FALSE
  90. CLS
  91.  
  92.  
  93. RESTART:
  94. DO
  95. COLOR GREEN%
  96.         'DISPLAY MENU
  97. CLS 0
  98.  
  99. PRINT "WELCOME TO THE WORLD OF GEOPHYSICS PROGRAMS"
  100. PRINT ""
  101. PRINT "PLEASE SELECT YOUR CHOICE FROM THE MENU"
  102. PRINT ""
  103. PRINT "         (1) FOLD AND SHIFT DATA"
  104. PRINT "         (2) NUMERICAL RECIPES"
  105. PRINT "         (3) GRAPH TEST"
  106. PRINT ""
  107. PRINT "         (4) SIGNAL PROCESSING"
  108. PRINT ""
  109. PRINT "         (5) EXIT TO DOS SHELL (TYPE 'EXIT' TO RETURN TO PROGRAM)"
  110. PRINT ""
  111. PRINT "         (6) GET SIGNAL BY TRAPEZOIDAL RULE "
  112. PRINT
  113. PRINT "         (7) "
  114. PRINT ""
  115. PRINT "         (8) NEW CONVOLUTION"
  116. PRINT ""
  117. PRINT "         (9) SEISMOGRAM"
  118. PRINT
  119. PRINT "        (10) QUIT"
  120. INPUT "ENTER A NUMBER TO INDICATE YOUR CHOICE "; CHOICE%
  121. PRINT ""
  122. 'RESPOND TO CHOICE
  123. SELECT CASE CHOICE%
  124.         CASE 1:
  125.                 CALL GETINPUTFILE(INPUTFILE$, INFILENUM)
  126.  
  127.                 CALL GETOUTPUTFILE(OUTPUTFILE$, OUTFILENUM)
  128.  
  129.         CASE 2:
  130.                 
  131.                 
  132.         CASE 3: 'GRAPH TEST
  133.                  CALL GRAPHTEST
  134.                  'CALL RESETALL
  135.        
  136.         CASE 4:
  137.       
  138.                 CALL MENUSIGNALPRO
  139.  
  140.        
  141.         CASE 5: COLOR 9
  142.         PRINT "TYPE EXIT TO RETURN TO PROGRAM"
  143.                 SHELL
  144.                 COLOR 2
  145.     
  146.         CASE 6:
  147.                   
  148.  
  149.         CASE 7:
  150.  
  151.         CASE 8:  CALL NEWCONVOLUTION
  152.        
  153.         CASE 9:
  154.  
  155.                 CALL SEISMOGRAMMENU
  156.        
  157.        
  158.         CASE 10: DONE = TRUE
  159.                 END
  160.              
  161. END SELECT       'SELECT CASE CHOICE
  162. LOOP UNTIL DONE
  163.  
  164. END
  165.  
  166. SUB ANOFCOS (N, H, TZERO, PERIOD, A)
  167. 'An=(2H/(n*PI) * SIN((2n*PI*TZERO)/PERIOD)  'n=1,2,3...
  168. IF (PERIOD = 0) THEN : A = 0: EXIT SUB
  169. IF N = 0 THEN : A = 4 * H * TZERO / PERIOD: EXIT SUB   'define DC Value=Ao
  170. A = (2 * H / (N * PI)) * SIN((2 * N * PI * TZERO) / PERIOD)
  171.  
  172. END SUB
  173.  
  174. REM $STATIC
  175. SUB BANDPASSFILTER (S(), TIME(), CN(), FREQ(), RA(), IA(), PHASEANGLE(), NP2)
  176.  
  177. REDIM FPOINT(0 TO 3), BPFILTER(0 TO NP2), COUNT(0 TO NP2)
  178.  
  179. FOR I = 0 TO 3
  180. PRINT "F("; I; ")"; " IS "; : INPUT FPOINT(I)
  181. NEXT I
  182. FOR I = LBOUND(FPOINT) TO UBOUND(FPOINT)
  183. PRINT FPOINT(I)
  184. NEXT I
  185.  
  186.  
  187. PRINT "READY TO GRAPH SIGNAL": WAITFORKEY
  188. CALL GETMINMAX(TIME(), S(), NP2, XMIN, XMAX, YMIN, YMAX)
  189. TITLE$ = "INPUT SIGNAL (" + DEL$ + " = " + STR$(DELTAT) + " sec)"
  190. CALL GRAPH(TIME(), S(), NP2, XMIN, XMAX, YMIN, YMAX, 0, TITLE$, "TIME (sec)", "S(t)")
  191.  
  192. CALL FFT(NP2, M, RA(), IA())  'SEND TIME DOMAIN S()=RA(), GET BACK RA() IN
  193.        ' FREQUENCY DOMAIN, AND IN RECTANGULAR COORDS
  194.  
  195. FOR N = 0 TO NP2
  196. CALL CNLINEAMPSPEC(RA(N), IA(N), CN(N))  '= |S(w)|,AMPSPEC IN F DOMAIN, NOW POLAR COORDS
  197. CALL PHASE(IA(N), RA(N), PHASEANGLE(N))  '=PHI(w), F DOMAIN, POLAR COORDS
  198. NEXT N
  199.  
  200. PRINT "READY TO GRAPH AMPLITUDE  SPECTRUM "
  201. CALL GETMINMAX(FREQ(), CN(), NP2, XMIN, XMAX, YMIN, YMAX)
  202. XMAX = FMAX
  203. CALL GRAPH(FREQ(), CN(), NP2, XMIN, XMAX, YMIN, YMAX, 0, "AMPLITUDE SPECTRUM OF THE INPUT SIGNAL", "FREQUENCY (w)", "S(w)")
  204.  
  205. CALL GWHILBERT(CN(), FREQ())
  206.  
  207. FOR I = (NP2 * .5) + 1 TO NP2
  208. CN(I) = 0: PHASEANGLE(I) = 0
  209. NEXT I
  210.  
  211.  
  212.  
  213. FOR I = 0 TO NP2 * .5
  214. IF FREQ(I) < FPOINT(0) OR FREQ(I) > FPOINT(3) THEN
  215. BPFILTER(I) = 0
  216. ELSEIF FREQ(I) <= FPOINT(1) THEN
  217. BPFILTER(I) = SIN((2 * PI * (FREQ(I) - FPOINT(0))) / (4 * (FPOINT(1) - FPOINT(0))))
  218. ELSEIF FREQ(I) < FPOINT(2) THEN
  219. BPFILTER(I) = 1
  220. ELSE
  221. BPFILTER(I) = COS((2 * PI * (FREQ(I) - FPOINT(2))) / (4 * (FPOINT(3) - FPOINT(2))))
  222. END IF
  223. CN(I) = CN(I) * BPFILTER(I)
  224. NEXT I
  225.  
  226.  
  227. PRINT "READY TO GRAPH THE BAND PASS FILTER": WAITFORKEY
  228. CALL GETMINMAX(FREQ(), BPFILTER(), NP2 * .5, XMIN, XMAX, YMIN, YMAX)
  229. TITLE$ = "BAND PASS FILTER"
  230. XMAX = FMAX
  231. YMIN = 0
  232. CALL GRAPH(FREQ(), BPFILTER(), NP2 * .5, XMIN, XMAX, YMIN, YMAX, 0, TITLE$, "FREQUENCY (Hz)", "BP FILTER")
  233.  
  234.  
  235. FOR I = 0 TO NP2    'CONVERT BACK TO RECTANGULAR BEFORE FFT
  236. RA(I) = CN(I) * COS(PHASEANGLE(I))
  237. IA(I) = CN(I) * (SIN(PHASEANGLE(I))) * -1
  238. NEXT I
  239.  
  240.  
  241. CALL FFT(NP2, M, RA(), IA())
  242.  
  243. PRINT "READY FOR THE FILTERED SIGNAL": WAITFORKEY
  244. CALL GETMINMAX(TIME(), RA(), NP2, XMIN, XMAX, YMIN, YMAX)
  245. TITLE$ = "THE BAND PASS FILTERED SIGNAL"
  246. XMAX = TMAX
  247. CALL GRAPH(TIME(), RA(), NP2, XMIN, XMAX, YMIN, YMAX, 0, TITLE$, "TIME (sec)", "S(t)")
  248.  
  249. END SUB
  250.  
  251. REM $DYNAMIC
  252. SUB BNOFSIN (N, H, TZERO, PERIOD, B)
  253. IF N = 0 THEN : B = 0: EXIT SUB
  254. B = -H * PERIOD / (N * PI)
  255. B = B * (COS(2 * N * PI * TZERO) - COS(2 * N * PI * (-TZERO)))
  256. END SUB
  257.  
  258. REM $STATIC
  259. SUB CNLINEAMPSPEC (A, B, C)
  260. C = SQR(A ^ 2 + B ^ 2)
  261. END SUB
  262.  
  263. SUB CONVOLUTION         'THIS WORKS !!!!!!!!!!!!!!!!!
  264. SNP = 0: GNP = 0: ISNP = 0: IGNP = 0: CONTOTAL = 0: DIVISOR = 1
  265. PRINT "SOLVE FOR h(t) = s(t) * g(t)"
  266. PRINT "FOR THE SIGNAL S(t)"
  267. CALL GETINPUTFILE(INPUTFILE$, INFILENUM)
  268. SINPUTFILE$ = INPUTFILE$: SINFILENUM = INFILENUM
  269. CALL GETOUTPUTFILE(OUTPUTFILE$, OUTFILENUM)
  270. 'INPUTFILE$ = "S.DAT"
  271. CALL GETARRAYSIZE(SINPUTFILE$, SINFILENUM, XDATATOTAL, YDATATOTAL)
  272. ISNP = YDATATOTAL - 1: START% = 0
  273.  
  274. PRINT "FOR THE SIGNAL G(t-T)"
  275. CALL GETINPUTFILE(INPUTFILE$, INFILENUM)
  276. GINPUTFILE$ = INPUTFILE$: GINFILENUM = INFILENUM
  277. CALL GETARRAYSIZE(GINPUTFILE$, GINFILENUM, XDATATOTAL, YDATATOTAL)
  278. IGNP = YDATATOTAL - 1: START% = 0
  279.  
  280. IF ISNP < IGNP THEN
  281. GNP = IGNP
  282. SNP = GNP
  283. ELSEIF IGNP < ISNP THEN
  284. SNP = ISNP
  285. GNP = SNP
  286. ELSE
  287. SNP = ISNP
  288. GNP = SNP
  289. END IF
  290.  
  291. PRINT "ISNP "; ISNP; " IGNP "; IGNP; " SNP "; SNP; " GNP "; GNP
  292. INPUT DUM$
  293. REDIM S(0 TO SNP - 1), G(0 TO GNP - 1), GFOLD(0 TO GNP - 1), CON(0 TO 2 * SNP - 1)
  294. REDIM GCOUNT(0 TO GNP - 1), SCOUNT(0 TO SNP - 1)
  295.  
  296. OPEN SINPUTFILE$ FOR INPUT AS #SINFILENUM
  297. FOR I = 0 TO ISNP - 1
  298. INPUT #SINFILENUM, S(I)
  299. NEXT I
  300. CLOSE #SINFILENUM
  301. OPEN GINPUTFILE$ FOR INPUT AS #GINFILENUM
  302. FOR I = 0 TO IGNP - 1
  303. INPUT #GINFILENUM, G(I)
  304. NEXT I
  305. CLOSE #GINFILENUM
  306.  
  307. CALL FOLDANDSHIFT(GNP, G(), GFOLD())
  308.  
  309. IF ISNP < IGNP THEN
  310. FOR I = ISNP + 1 TO GNP - 1
  311. S(I) = 0
  312. NEXT I
  313. ELSEIF IGNP < ISNP THEN
  314. FOR I = IGNP + 1 TO SNP - 1
  315. G(I) = 0
  316. NEXT I
  317. END IF
  318.  
  319. PRINT "ISNP "; ISNP; " SNP "; SNP
  320. PRINT "IGNP "; IGNP; " GNP "; GNP
  321.  
  322. FOR I = 0 TO SNP - 1
  323. SCOUNT(I) = I
  324. GCOUNT(I) = I
  325. NEXT I
  326.  
  327. '*****************************************
  328. LX = SNP: LB = GNP
  329. LY = 0: LY = LX + LB: CONTOTAL = LY
  330. REDIM LX(1 TO LX), LB(1 TO LB), CY(1 TO LY)
  331.  
  332. PRINT "LX "; LX; " LB "; LB; " LY "; LY
  333. REDIM CONCOUNT(0 TO CONTOTAL)
  334. FOR I = 0 TO CONTOTAL
  335. CONCOUNT(I) = I
  336. NEXT I
  337. FOR I = 1 TO SNP
  338. LX(I) = S(I - 1)
  339. LB(I) = G(I - 1)
  340. NEXT I
  341.  
  342. FOR I = 1 TO LX
  343. FOR J = 1 TO LB
  344. CY(I + J - 1) = CY(I + J - 1) + LX(I) * LB(J)
  345. NEXT J
  346. NEXT I
  347.  
  348. FOR I = 0 TO SNP * 2 - 1
  349. CON(I) = CY(I + 1)
  350. NEXT I
  351. ERASE CY, LX, LB
  352.  
  353. INPUT DUM$
  354. '*****************************************
  355. PRINT "READY TO GRAPH S(t)"
  356. P = SNP
  357. CALL GETMINMAX(SCOUNT(), S(), P, XMIN, XMAX, YMIN, YMAX)
  358.  
  359. TITLE$ = "S(t)"
  360. YTITLE$ = "S(t)"
  361. XTITLE$ = "POINT COUNT"
  362. CALL GRAPH(SCOUNT(), S(), P, XMIN, XMAX, YMIN, YMAX, 0, TITLE$, XTITLE$, YTITLE$)
  363.  
  364. PRINT "READY TO GRAPH g(t)"
  365. P = GNP
  366. CALL GETMINMAX(GCOUNT(), G(), P, XMIN, XMAX, YMIN, YMAX)
  367. TITLE$ = "g(t)"
  368. YTITLE$ = "g(t)"
  369. XTITLE$ = "POINT COUNT"
  370. CALL GRAPH(GCOUNT(), G(), P, XMIN, XMAX, YMIN, YMAX, 0, TITLE$, XTITLE$, YTITLE$)
  371.  
  372. PRINT "READY TO GRAPH THE FOLDED SIGNAL"
  373. P = GNP
  374. CALL GETMINMAX(GCOUNT(), GFOLD(), P, XMIN, XMAX, YMIN, YMAX)
  375. TITLE$ = "G(t) FOLDED"
  376. YTITLE$ = "G(t) FOLDED"
  377. XTITLE$ = "POINT COUNT"
  378. CALL GRAPH(GCOUNT(), GFOLD(), P, XMIN, XMAX, YMIN, YMAX, 0, TITLE$, XTITLE$, YTITLE$)
  379.  
  380.  
  381. PRINT "READY TO GRAPH THE CONVOLUTION"
  382. 'LINE INPUT "ENTER THE TITLE "; TITLE$
  383.  
  384. CALL GETMINMAX(CONCOUNT(), CON(), CONTOTAL, XMIN, XMAX, YMIN, YMAX)
  385. PRINT "CONTOTAL "; CONTOTAL
  386. PRINT "XMIN "; XMIN
  387. PRINT "XMAX "; XMAX
  388. TITLE$ = "CONVOLUTION p(t)=s(t) * g(t)"
  389. YTITLE$ = "P(t)"
  390. XTITLE$ = ""
  391. TITLE$ = CT$
  392. INPUT DUM$
  393. CALL GRAPH(CONCOUNT(), CON(), CONTOTAL, XMIN, XMAX, YMIN, YMAX, 0, TITLE$, XTITLE$, YTITLE$)
  394. PRINT "WRITING TO "; OUTPUTFILE$
  395. OPEN OUTPUTFILE$ FOR OUTPUT AS #OUTFILENUM
  396. PRINT #OUTFILENUM, "I", "S(I)", "G(I)", "GFOLD(I)"
  397. FOR I = 0 TO SNP - 1
  398. PRINT #OUTFILENUM, I, ",", S(I), ",", G(I), ",", GFOLD(I)
  399. NEXT I
  400. PRINT #OUTFILENUM, "I", "CON(I)"
  401. FOR I = 0 TO SNP * 2 - 1
  402. PRINT #OUTFILENUM, I, ",", CON(I)
  403. NEXT I
  404. CLOSE #OUTFILENUM
  405.  
  406. ERASE SCOUNT, GCOUNT, CONCOUNT, S, G, CON, GFOLD
  407.  
  408.  
  409.  
  410. END SUB
  411.  
  412. SUB CONVOLV (ISNP, NP2, S(), G())
  413. 'THIS IS AN OLD VERSION IT DOES NOT WORK ??????????????
  414. IGNP = ISNP: DIVISOR = 1
  415. SNP = NP2: GNP = NP2
  416.  
  417. REDIM SCOUNT(START% TO NP2), CON(START% TO NP2 * 2)
  418. REDIM GCOUNT(START% TO NP2), GFOLD(START% TO NP2)
  419.  
  420. FOR I = 0 TO NP2 - 1
  421. SCOUNT(I) = I
  422. GCOUNT(I) = I
  423. NEXT I
  424.  
  425. CALL FOLDANDSHIFT(NP2, G(), GFOLD())
  426.  
  427. FOR I = ISNP + 1 TO NP2
  428. GFOLD(I) = 0
  429. S(I) = 0
  430. NEXT I
  431.  
  432. '********************************
  433. PRINT "STARTED CONVOLUTION AT "; TIME$
  434. SUM = 0
  435. FOR J = 0 TO NP2 - 1
  436. CON(J) = S(J) * GFOLD(NP2 - 1 - J)
  437. SUM = SUM + CON(J)
  438. CON(J) = SUM / DIVISOR
  439. NEXT J
  440. COUNTER = 0
  441. FOR J = NP2 TO (2 * NP2 - 2)
  442. SUM = 0:  COUNTER = COUNTER + 1
  443. FOR I = COUNTER TO NP2 - 1
  444. SUM = S(I) * GFOLD(I - COUNTER) + SUM
  445. NEXT I
  446. CON(J) = SUM / DIVISOR
  447. NEXT J
  448. CON(2 * NP2 - 1) = 0
  449.  
  450. CONTOTAL = NP2 * 2
  451. REDIM CONCOUNT(0 TO CONTOTAL - 1)
  452. FOR I = 0 TO CONTOTAL - 1
  453. CONCOUNT(I) = I
  454. NEXT I
  455. PRINT "ENDED CONVOLUTION AT "; TIME$
  456. '*********************************
  457. 'PRINT "OUTPUT WRITTEN TO "; OUTPUTFILE$
  458. 'OPEN OUTPUTFILE$ FOR OUTPUT AS #OUTFILENUM
  459. 'OUTFILENUM = FREEFILE
  460. 'OPEN "DUM.OUT" FOR OUTPUT AS #OUTFILENUM
  461.  
  462. 'PRINT #OUTFILENUM, "I", "S(I)", "G(I)"
  463. 'TMP$ = "############.#######"
  464. 'FOR I = 0 TO ISNP - 1
  465. 'PRINT #OUTFILENUM, I,
  466. 'PRINT #OUTFILENUM, USING TMP$; S(I); G(I)
  467. 'NEXT I
  468. 'PRINT #OUTFILENUM, "I", "CON(I)"
  469. 'FOR I = 0 TO CONTOTAL - 1
  470. 'PRINT #OUTFILENUM, I,
  471. 'PRINT #OUTFILENUM, USING TMP$; CON(I)
  472. 'NEXT I
  473. 'CLOSE
  474.  
  475. PRINT "READY TO GRAPH S(t)"
  476. P = NP2 / 2
  477. CALL GETMINMAX(SCOUNT(), S(), P, XMIN, XMAX, YMIN, YMAX)
  478. TITLE$ = "S(t)"
  479. YTITLE$ = "S(t)"
  480. XTITLE$ = "POINT COUNT"
  481. CALL GRAPH(SCOUNT(), S(), P, XMIN, XMAX, YMIN, YMAX, 0, TITLE$, XTITLE$, YTITLE$)
  482.  
  483. PRINT "READY TO GRAPH g(t)"
  484. P = NP2
  485. CALL GETMINMAX(GCOUNT(), G(), P, XMIN, XMAX, YMIN, YMAX)
  486. TITLE$ = "g(t)"
  487. YTITLE$ = "g(t)"
  488. XTITLE$ = "POINT COUNT"
  489. CALL GRAPH(GCOUNT(), G(), P, XMIN, XMAX, YMIN, YMAX, 0, TITLE$, XTITLE$, YTITLE$)
  490.  
  491. PRINT "READY TO GRAPH THE FOLDED SIGNAL"
  492. P = NP2
  493. CALL GETMINMAX(GCOUNT(), GFOLD(), P, XMIN, XMAX, YMIN, YMAX)
  494. TITLE$ = "G(t) FOLDED"
  495. YTITLE$ = "G(t) FOLDED"
  496. XTITLE$ = "POINT COUNT"
  497. CALL GRAPH(GCOUNT(), GFOLD(), IGNP, XMIN, XMAX, YMIN, YMAX, 0, TITLE$, XTITLE$, YTITLE$)
  498.  
  499. PRINT "READY TO GRAPH THE CONVOLUTION"
  500. 'LINE INPUT "ENTER THE TITLE "; TITLE$
  501. TITLE$ = "Trace1 * f(t), f0 = 40 Hz"
  502. CALL GETMINMAX(CONCOUNT(), CON(), CONTOTAL, XMIN, XMAX, YMIN, YMAX)
  503. PRINT "CONTOTAL "; CONTOTAL
  504. PRINT "XMIN "; XMIN
  505. PRINT "XMAX "; XMAX
  506. INPUT DUM$
  507. 'TITLE$ = "CONVOLUTION p(t)=s(t) * g(t)"
  508. YTITLE$ = "P(t)"
  509. XTITLE$ = ""
  510. CALL GRAPH(CONCOUNT(), CON(), CONTOTAL, XMIN, XMAX, YMIN, YMAX, 0, TITLE$, XTITLE$, YTITLE$)
  511. 'WAITFORKEY
  512. END SUB
  513.  
  514. SUB CROSSCORRELATION
  515. 'NOTE:  SINCE THE CONVOLUTION ROUTINE I'M USING FOLDS THE 2nd SIGNAL, I
  516. '       NEED TO FOLD THE 2nd SIGNAL IN THE CORRELATION ROUTINE BEFORE
  517. '       I SEND IT TO THE CONVOLUTION IN ORDER TO REVERSE THE EFFECTS OF
  518. '       THE FOLDING IN THE CONVOLUTION
  519.  
  520. SNP = 0: GNP = 0: ISNP = 0: IGNP = 0: CONTOTAL = 0: DIVISOR = 1
  521. PRINT "CROSS CORRELATION"
  522. PRINT "SOLVE FOR h(t) = s(t) * g(t)"
  523. PRINT "FOR THE SIGNAL S(t)"
  524. CALL GETINPUTFILE(INPUTFILE$, INFILENUM)
  525. SINPUTFILE$ = INPUTFILE$: SINFILENUM = INFILENUM
  526. CALL GETOUTPUTFILE(OUTPUTFILE$, OUTFILENUM)
  527. 'INPUTFILE$ = "S.DAT"
  528. CALL GETARRAYSIZE(SINPUTFILE$, SINFILENUM, XDATATOTAL, YDATATOTAL)
  529. ISNP = YDATATOTAL - 1
  530. PRINT "ISNP,YT "; ISNP, YDATATOTAL
  531.  
  532. PRINT "FOR THE SIGNAL G(t-T)"
  533. CALL GETINPUTFILE(INPUTFILE$, INFILENUM)
  534. GINPUTFILE$ = INPUTFILE$: GINFILENUM = INFILENUM
  535. CALL GETARRAYSIZE(GINPUTFILE$, GINFILENUM, XDATATOTAL, YDATATOTAL)
  536. IGNP = YDATATOTAL - 1
  537. PRINT "IGNP, YT "; IGNP, YDATATOTAL
  538.  
  539. '**************************************
  540.  
  541. IF ISNP < IGNP THEN
  542. GNP = IGNP
  543. SNP = GNP
  544. ELSEIF IGNP < ISNP THEN
  545. SNP = ISNP
  546. GNP = SNP
  547. ELSE
  548. SNP = ISNP
  549. GNP = SNP
  550. END IF
  551. PRINT "ISNP "; ISNP; " IGNP "; IGNP; " SNP "; SNP; " GNP "; GNP
  552.  
  553. START% = 0
  554. REDIM S(START% TO SNP), SCOUNT(START% TO SNP), CON(START% TO SNP * 2)
  555. REDIM G(START% TO GNP), GCOUNT(START% TO GNP), GFOLD(START% TO GNP)
  556.  
  557. FOR I = 0 TO SNP - 1
  558. SCOUNT(I) = I
  559. GCOUNT(I) = I
  560. NEXT I
  561.  
  562. IF ISNP < IGNP THEN
  563. FOR I = ISNP + 1 TO GNP
  564. S(I) = 0
  565. NEXT I
  566. ELSEIF IGNP < ISNP THEN
  567. FOR I = IGNP + 1 TO SNP
  568. G(I) = 0
  569. NEXT I
  570. END IF
  571.  
  572. PRINT "ISNP "; ISNP; " SNP "; SNP
  573. PRINT "IGNP "; IGNP; " GNP "; GNP
  574.  
  575. OPEN SINPUTFILE$ FOR INPUT AS #SINFILENUM
  576. FOR I = 0 TO ISNP - 1
  577. INPUT #SINFILENUM, S(I)    'THE SIGNAL
  578. NEXT I
  579. CLOSE #SINFILENUM
  580.  
  581. OPEN GINPUTFILE$ FOR INPUT AS #GINFILENUM
  582. FOR I = 0 TO IGNP - 1
  583. INPUT #GINFILENUM, G(I)    'THE SIGNAL
  584. NEXT I
  585. CLOSE #GINFILENUM
  586.  
  587. COLOR RED%: PRINT "WORKING...": COLOR GREEN%
  588.  
  589. CALL FOLDANDSHIFT(GNP, G(), GFOLD())
  590.  
  591. PRINT "I", "S", "G", "GF"
  592. FOR I = 0 TO SNP - 1
  593. PRINT I, S(I), G(I), GFOLD(I)
  594. NEXT I
  595.  
  596. '*****************************************
  597. LX = SNP: LB = GNP
  598. LY = 0: LY = LX + LB: CONTOTAL = LY
  599. REDIM LX(1 TO LX), LB(1 TO LB), CY(1 TO LY)
  600.  
  601. PRINT "LX "; LX; " LB "; LB; " LY "; LY
  602. REDIM CONCOUNT(0 TO CONTOTAL)
  603. FOR I = 0 TO CONTOTAL - 1
  604. CONCOUNT(I) = I
  605. NEXT I
  606. FOR I = 1 TO SNP
  607. LX(I) = S(I - 1)
  608. LB(I) = GFOLD(I - 1)
  609. 'LB(I) = G(I - 1)
  610. NEXT I
  611.  
  612. FOR I = 1 TO LX
  613. FOR J = 1 TO LB
  614. CY(I + J - 1) = CY(I + J - 1) + LX(I) * LB(J)
  615. NEXT J
  616. NEXT I
  617. PRINT "IN NEWCONV"
  618. FOR I = 1 TO 2 * SNP
  619. PRINT CY(I)
  620. NEXT I
  621. FOR I = 0 TO SNP * 2 - 1
  622. CON(I) = CY(I + 1)
  623. NEXT I
  624. ERASE CY, LX, LB
  625. '*****************************************
  626.  
  627. PRINT "ISNP "; ISNP; " SNP "; SNP
  628. PRINT "IGNP "; IGNP; " GNP "; GNP
  629. PRINT "CONTOTAL "; CONTOTAL
  630. INPUT DUM$
  631.  
  632. PRINT "OUTPUT WRITTEN TO "; OUTPUTFILE$
  633. OPEN OUTPUTFILE$ FOR OUTPUT AS #OUTFILENUM
  634.  
  635. PRINT #OUTFILENUM, "I", , "S(I)", "G(I)"
  636. TMP$ = "############.#######"
  637. FOR I = 1 TO ISNP
  638. PRINT #OUTFILENUM, I,
  639. PRINT #OUTFILENUM, USING TMP$; S(I); G(I)
  640. NEXT I
  641. PRINT #OUTFILENUM, "I", "CON(I)"
  642. FOR I = 1 TO CONTOTAL
  643. PRINT #OUTFILENUM, I,
  644. PRINT #OUTFILENUM, USING TMP$; CON(I)
  645. NEXT I
  646. CLOSE
  647.  
  648. PRINT "READY TO GRAPH S(t)"
  649. P = SNP
  650. CALL GETMINMAX(SCOUNT(), S(), P, XMIN, XMAX, YMIN, YMAX)
  651. 'INPUT DUM$
  652. TITLE$ = "S(t)"
  653. YTITLE$ = "S(t)"
  654. XTITLE$ = "POINT COUNT"
  655. CALL GRAPH(SCOUNT(), S(), P, XMIN, XMAX, YMIN, YMAX, 0, TITLE$, XTITLE$, YTITLE$)
  656.  
  657. PRINT "READY TO GRAPH g(t)"
  658. P = GNP
  659. CALL GETMINMAX(GCOUNT(), G(), P, XMIN, XMAX, YMIN, YMAX)
  660. TITLE$ = "g(t)"
  661. YTITLE$ = "g(t)"
  662. XTITLE$ = "POINT COUNT"
  663. CALL GRAPH(GCOUNT(), G(), P, XMIN, XMAX, YMIN, YMAX, 0, TITLE$, XTITLE$, YTITLE$)
  664.  
  665. PRINT "READY TO GRAPH THE FOLDED SIGNAL"
  666. P = GNP
  667. CALL GETMINMAX(GCOUNT(), GFOLD(), P, XMIN, XMAX, YMIN, YMAX)
  668. TITLE$ = "G(t) FOLDED"
  669. YTITLE$ = "G(t) FOLDED"
  670. XTITLE$ = "POINT COUNT"
  671. CALL GRAPH(GCOUNT(), GFOLD(), P, XMIN, XMAX, YMIN, YMAX, 0, TITLE$, XTITLE$, YTITLE$)
  672.  
  673.  
  674. PRINT "READY TO GRAPH THE CONVOLUTION CROSS CORRELATION"
  675. 'LINE INPUT "ENTER THE TITLE "; TITLE$
  676. TITLE$ = "CROSS CORRELATION OF "
  677. INPUT "CROSS CORRELATION OF "; TCC$
  678. TITLE$ = TITLE$ + TCC$
  679.  
  680. CALL GETMINMAX(CONCOUNT(), CON(), CONTOTAL, XMIN, XMAX, YMIN, YMAX)
  681. PRINT "CONTOTAL "; CONTOTAL
  682. PRINT "XMIN "; XMIN
  683. PRINT "XMAX "; XMAX
  684. 'TITLE$ = "CONVOLUTION p(t)=s(t) * g(t)"
  685. YTITLE$ = "P(t)"
  686. XTITLE$ = ""
  687. CALL GRAPH(CONCOUNT(), CON(), CONTOTAL, XMIN, XMAX, YMIN, YMAX, 0, TITLE$, XTITLE$, YTITLE$)
  688.  
  689. 'WAITFORKEY
  690. ERASE S, SCOUNT, CON, G, GCOUNT
  691. END SUB
  692.  
  693. SUB DEGHOST
  694. PRINT "FOR THE SIGNAL E(t)"
  695. CALL GETINPUTFILE(INPUTFILE$, INFILENUM)
  696. SINPUTFILE$ = INPUTFILE$: SINFILENUM = INFILENUM
  697. CALL GETOUTPUTFILE(OUTPUTFILE$, OUTFILENUM)
  698. 'INPUTFILE$ = "S.DAT"
  699. CALL GETARRAYSIZE(SINPUTFILE$, SINFILENUM, XDATATOTAL, YDATATOTAL)
  700. ISNP = YDATATOTAL - 1: START% = 0
  701. CALL GETPOWEROFTWO(ISNP, M, NP2)
  702.  
  703. REDIM S(0 TO ISNP - 1), G(0 TO ISNP - 1), GFOLD(0 TO ISNP - 1), CON(0 TO 2 * NP2 - 1)
  704. REDIM GCOUNT(0 TO ISNP - 1), SCOUNT(0 TO ISNP - 1)
  705. REDIM RA(0 TO NP2 - 1), IA(0 TO NP2 - 1), OMEGA(0 TO NP2 - 1), FREQ(0 TO NP2 - 1)
  706. REDIM TIME(0 TO NP2 - 1), PHASEANGLE(0 TO NP2 - 1), F(0 TO NP2 - 1)
  707. REDIM FP(0 TO NP2 - 1), CN(0 TO NP2 - 1)
  708.  
  709.  
  710. OPEN SINPUTFILE$ FOR INPUT AS #SINFILENUM
  711. FOR I = 0 TO ISNP - 1
  712. INPUT #SINFILENUM, S(I)
  713. NEXT I
  714. CLOSE #SINFILENUM
  715.  
  716.  
  717. INPUT "ENTER DEPTH OF SOURCE       "; DEPTHOFSOURCE
  718. INPUT "ENTER THE VELOCITY OF WATER "; VH20
  719. INPUT "ENTER Ro                    "; RO
  720.  
  721. TAUZERO = 2 * DEPTHTOSOURCE / VH20
  722. DELTAT = .01
  723. DELTAF = 1 / (NP2 * DELTAT)
  724.  
  725.  
  726. FOR I = 0 TO NP2 - 1
  727. TIME(I) = I * DELTAT
  728. FREQ(I) = I * DELTAF
  729. OMEGA(I) = FREQ(I) * 2 * PI
  730. RA(I) = (1 + RO * COS(TAUZERO * OMEGA(I))) ^ 2
  731. PRINT "RA "; RA(I)  ': INPUT DUM$
  732. IA(I) = RO * SIN(TAUZERO * OMEGA(I))
  733. CALL CNLINEAMPSPEC(RA(I), IA(I), CN(I))  '= |S(w)|,AMPSPEC IN F DOMAIN, NOW POLAR COORDS
  734. CALL PHASE(IA(I), RA(I), PHASEANGLE(I))  '=PHI(w), F DOMAIN, POLAR COORDS
  735. 'PHASEANGLE(I) = PHASEANGLE(I) + OMEGA(I) * TAUZERO
  736. PRINT "RA "; RA(I)
  737. PRINT "IA "; IA(I)
  738. PRINT "PHI "; PHASEANGLE(I)  ': INPUT DUM$
  739. F(I) = 1 / (1 + RA(I) ^ 2 + IA(I) ^ 2) ^ .5 * PHASEANGLE(I)
  740. FP(I) = 0
  741. NEXT I
  742.  
  743.  
  744. PRINT "READY TO GRAPH THE F"
  745. CALL GETMINMAX(FREQ(), F(), NP2, XMIN, XMAX, YMIN, YMAX)
  746. 'XMAX = FMAX
  747. 'YMIN = 0
  748. INPUT "XMIN "; XMIN
  749. INPUT "XMAX "; XMAX
  750. INPUT DUM$
  751. CALL GRAPH(FREQ(), F(), NP2, XMIN, XMAX, YMIN, YMAX, 0, FTTITLE$, "FREQUENCY (Hz)", "FILTER")
  752.  
  753.  
  754. CALL FFT(NP2, M, F(), FP())    'SENDING F DOMAIN, WILL RETURN T DOMAIN
  755.  
  756.  
  757. PRINT "READY TO GRAPH THE F IN TIME"
  758. CALL GETMINMAX(TIME(), F(), NP2, XMIN, XMAX, YMIN, YMAX)
  759. 'XMAX = FMAX
  760. 'YMIN = 0
  761. INPUT "XMIN "; XMIN
  762. INPUT "XMAX "; XMAX
  763.  
  764. INPUT DUM$
  765. CALL GRAPH(TIME(), F(), NP2, XMIN, XMAX, YMIN, YMAX, 0, FTTITLE$, "FREQUENCY (Hz)", "FILTER")
  766.  
  767.  
  768.  
  769.  
  770. END SUB
  771.  
  772. SUB DIMTRANSFORM
  773. REM $DYNAMIC
  774. 'DEFINT I-N
  775. FORWARD = 1
  776. REVERSE = -1
  777.  
  778. '********************* 2 D TRANSFORM
  779. REM $DYNAMIC
  780. 'DEFINT I-N
  781. FORWARD = 1
  782. REVERSE = -1
  783.  
  784. PRINT "FOR THE FILE CONTAINING THE MULTIDIMENSIONAL DATA "
  785.  
  786. CALL GETINPUTFILE(INPUTFILE$, INFILENUM)
  787. SINPUTFILE$ = INPUTFILE$: SINFILENUM = INFILENUM
  788. CALL GETOUTPUTFILE(OUTPUTFILE$, OUTFILENUM)
  789. INPUTFILE$ = "S.DAT"
  790. CALL GETARRAYSIZE(SINPUTFILE$, SINFILENUM, XDATATOTAL, YDATATOTAL)
  791. ISNP = YDATATOTAL - 1
  792. PRINT "ISNP,YT "; ISNP, YDATATOTAL
  793. ROW = YDATATOTAL: COL = XDATATOTAL
  794.  
  795.  
  796.  
  797. NDIM = XDATATOTAL - 1
  798. XCOL = XDATATOTAL
  799. YROW = YDATATOTAL
  800. SNDAT = NDIM * YDATATOTAL * 2
  801.  
  802. 'CALL GETPOWEROFTWO(SNDAT, Z, SNP2)
  803. SNP2 = SNDAT
  804.  
  805. REDIM NN(3)
  806. PROD = 1
  807. FOR I = 1 TO 3
  808. NN(I) = 2 * (2 ^ I)
  809. PROD = PROD * NN(I)
  810. NEXT I
  811.  
  812.  
  813.  
  814. PRINT " PROD IS "; PROD
  815. PRINT "X COL = "; COL; "Y  ROWS = "; ROW
  816. PRINT "SNDAT "; SNDAT; " SNP2 "; SNP2: INPUT DUM$
  817.  
  818. REDIM DAT(0 TO XDATATOTAL - 1, 0 TO YDATATOTAL - 1), SS(SNP2), INV(SNP2)
  819. 'REDIM AMP(0 TO (SNP2 - 1) * PROD), AMPCOUNT(0 TO (SNP2 - 1) * PROD)
  820. 'REDIM NEWAMP(0 TO (SNP2 - 1) * PROD)
  821.  
  822. AMAX = 32767 - 17000           ''  ARRAY MAX 32767
  823. REDIM AMP(0 TO AMAX), AMPCOUNT(0 TO AMAX), NEWAMP(0 TO AMAX)
  824.  
  825.  
  826.  
  827. INF = FREEFILE
  828. OPEN SINPUTFILE$ FOR INPUT AS #INF
  829. AMPCOUNT = 0
  830. FOR ROW = 0 TO YROW - 1
  831. FOR COL = 0 TO XCOL - 2
  832. INPUT #INF, DAT(COL, ROW)
  833. AMPCOUNT(AMPCOUNT) = AMPCOUNT
  834. AMP(AMPCOUNT) = DAT(COL, ROW)
  835. AMPCOUNT = AMPCOUNT + 1
  836. NEXT COL
  837. NEXT ROW
  838.  
  839. 'CALL GETMINMAX(AMPCOUNT(), AMP(), AMPCOUNT, XMIN, XMAX, YMIN, YMAX)
  840. 'CALL GRAPH(AMPCOUNT(), AMP(), AMPCOUNT, XMIN, XMAX, YMIN, YMAX, 0, T$, X$, Y$)
  841.  
  842.  
  843. 'CALL HARM (a(), M%(), INV%(), S(), ifset%, IFERR%)
  844. ISIGN = FORWARD
  845. CALL HARM(AMP(), NN(), INV(), SS(), ISIGN, IFFERR)
  846.  
  847. NEWAMPCOUNT = 0
  848. FOR I = 0 TO AMPCOUNT - 2
  849. NEWAMP(I) = SQR(AMP(I) ^ 2 + AMP(I + 1) ^ 2)
  850. NEXT I
  851.  
  852.  
  853. CALL GETMINMAX(AMPCOUNT(), NEWAMP(), AMPCOUNT, XMIN, XMAX, YMIN, YMAX)
  854. CALL GRAPH(AMPCOUNT(), NEWAMP(), AMPCOUNT, XMIN, XMAX, YMIN, YMAX, 0, T$, X$, Y$)
  855.  
  856. ERASE NN, DAT, INV, SS, AMP
  857.  
  858.  
  859.  
  860. '**************************************************
  861. END SUB
  862.  
  863. SUB FASTFOURIER (INPUTFILE$, INFILENUM, OUTPUTFILE$, OUTFILENUM, NP)
  864. CALL GETPOWEROFTWO(NP, M, NP2)
  865. INPUT "ENTER THE SAMPLE RATE IN MSEC (1.0) "; R$: CALL NIFDEFAULT(R$, DELTAT, 1)
  866.  
  867. INPUT "DO YOU WANT TO ENTER A PHASE SHIFT "; YORN$
  868. ISPHASESHIFT = FALSE
  869. IF UCASE$(YORN$) = "Y" THEN
  870. ISPHASESHIFT = TRUE
  871. INPUT "ENTER THE SHIFT ( + T OR - T) IN msec "; PSHIFT
  872. PSHIFT = PSHIFT * .001   'CONVERT MSEC TO SEC
  873. END IF
  874. INPUT "DO YOU WANT TO FILTER "; YORN$              'FILTER
  875. DOFILT = FALSE
  876. IF UCASE$(YORN$) = "Y" THEN
  877. DOFILT = TRUE
  878. REDIM FILT(0 TO NP2)
  879. END IF
  880.  
  881. DELTAT = DELTAT * .001      'CONVERT MSEC TO SEC
  882. PRINT "DELTAT = "; DELTAT
  883. PRINT "TOTAL OF S() "; NP
  884. PRINT "NP2 IS "; NP2
  885. PRINT "M = "; M
  886. DELTAF = 1 / NP2 / DELTAT
  887. DELTAW = 2 * PI * DELTAF
  888. PHASESHIFT$ = STR$(PSHIFT)
  889. FMAX = 1 / (2 * DELTAT)
  890. TMAX = NP * DELTAT
  891.  
  892. PRINT "WORKING...": START% = 0
  893. REDIM AN(START% TO NP2), BN(START% TO NP2)
  894. REDIM CN(START% TO NP2), TIME(START% TO NP2)
  895. REDIM PHASEANGLE(START% TO NP2), SIGNEW(START% TO NP2)
  896. REDIM S(START% TO NP2), FREQ(START% TO NP2), ENV(START% TO NP2)
  897. REDIM RA(START% TO NP2), IA(START% TO NP2), COUNT(START% TO NP2)
  898. IF ISPHASESHIFT = TRUE THEN
  899. REDIM OMEGA(START% TO NP2)
  900. END IF
  901.  
  902. OPEN INPUTFILE$ FOR INPUT AS #INFILENUM
  903. FOR I = 0 TO NP - 1
  904. INPUT #INFILENUM, S(I)    'THE SIGNAL
  905. RA(I) = S(I)              'SENDING TIME DOMAIN
  906. NEXT I
  907. CLOSE #INFILENUM
  908. FOR I = 0 TO NP2 - 1
  909. TIME(I) = I * DELTAT
  910. FREQ(I) = I * DELTAF
  911. COUNT(I) = I
  912. NEXT I
  913.  
  914. PRINT "READY TO GRAPH SIGNAL"
  915. CALL GETMINMAX(COUNT(), S(), NP2, XMIN, XMAX, YMIN, YMAX)
  916. TITLE$ = "INPUT SIGNAL (" + DEL$ + " = " + STR$(DELTAT) + " sec)"
  917. CALL GRAPH(COUNT(), S(), NP2, XMIN, XMAX, YMIN, YMAX, 0, TITLE$, "TIME (sec)", "S(t)")
  918.  
  919. CALL FFT(NP2, M, RA(), IA())  'SEND TIME DOMAIN S()=RA(), GET BACK RA() IN
  920.        ' FREQUENCY DOMAIN, AND IN RECTANGULAR COORDS
  921.  
  922. IF NOT ISPHASESHIFT THEN   '<> TRUE THEN
  923. FOR N = 0 TO NP2
  924. CALL CNLINEAMPSPEC(RA(N), IA(N), CN(N))  '= |S(w)|,AMPSPEC IN F DOMAIN, NOW POLAR COORDS
  925. CALL PHASE(IA(N), RA(N), PHASEANGLE(N))  '=PHI(w), F DOMAIN, POLAR COORDS
  926. NEXT N
  927. 'PRINT "NO PHASESHIFT ": WAITFORKEY
  928. ELSE
  929. FOR N = 0 TO NP2
  930. CALL CNLINEAMPSPEC(RA(N), IA(N), CN(N))  '= |S(w)|,AMPSPEC IN F DOMAIN, NOW POLAR COORDS
  931. CALL PHASE(IA(N), RA(N), PHASEANGLE(N))  '=PHI(w), F DOMAIN, POLAR COORDS
  932. OMEGA(N) = FREQ(N) * 2 * PI
  933. PHASEANGLE(N) = PHASEANGLE(N) + OMEGA(N) * PSHIFT
  934. NEXT N
  935. 'PRINT "YES PHASESHIFT ": WAITFORKEY
  936. END IF
  937.  
  938. FOR I = (NP2 * .5) + 1 TO NP2
  939. CN(I) = 0: PHASEANGLE(I) = 0
  940. NEXT I
  941.  
  942. PRINT "READY TO GRAPH AMPLITUDE  SPECTRUM "
  943. CALL GETMINMAX(FREQ(), CN(), NP2, XMIN, XMAX, YMIN, YMAX)
  944. XMAX = FMAX
  945. CALL GRAPH(FREQ(), CN(), NP2, XMIN, XMAX, YMIN, YMAX, 0, "AMPLITUDE SPECTRUM OF THE INPUT SIGNAL", "FREQUENCY (w)", "S(w)")
  946.  
  947. CALL GWHILBERT(CN(), FREQ())
  948.  
  949. '*********************  THE FILTER
  950. IF DOFILT THEN
  951. 'FPOINT(0) = 60: FPOINT(1) = 90: FPOINT(2) = 120: FPOINT(3) = 175
  952.  
  953. CALL GETFILTER(FILT(), FREQ(), NP2, FSTITLE$, FTTITLE$)
  954.  
  955. FOR I = 0 TO NP2
  956. CN(I) = CN(I) * FILT(I)
  957. NEXT I
  958.  
  959.  
  960. PRINT "READY TO GRAPH THE FILTER"
  961. CALL GETMINMAX(FREQ(), FILT(), NP2 * .5, XMIN, XMAX, YMIN, YMAX)
  962. XMAX = FMAX
  963. YMIN = 0
  964. CALL GRAPH(FREQ(), FILT(), NP2 * .5, XMIN, XMAX, YMIN, YMAX, 0, FTTITLE$, "FREQUENCY (Hz)", "FILTER")
  965.  
  966. '*****************
  967. REDIM FQ(0 TO NP2), F2(0 TO NP2), F2R(0 TO NP2), F2I(0 TO NP2)
  968. REDIM FPHASE(0 TO NP2)
  969. FOR I = 0 TO NP2
  970. FQ(I) = FREQ(I)
  971. F2(I) = FILT(I)
  972. NEXT I
  973. CALL GWHILBERT(F2(), FQ())
  974. FOR I = 0 TO NP2
  975. F2R(I) = F2(I) * COS(FPHASE(I))
  976. F2I(I) = F2(I) * SIN(FPHASE(I)) * -1
  977. NEXT I
  978.  
  979. CALL FFT(NP2, M, F2R(), F2I())
  980. DUM = FREEFILE
  981. OPEN "FDUM.OUT" FOR OUTPUT AS #DUM
  982. FOR I = 0 TO NP2
  983. PRINT #DUM, F2(I)
  984. NEXT I
  985. CLOSE #DUM
  986. PRINT "READY TO GRAPH THE FILTER IN TIME DOMAIN"
  987. CALL GETMINMAX(TIME(), F2R(), NP2, XMIN, XMAX, YMIN, YMAX)
  988. PRINT "TMAX "; TMAX
  989. INPUT "ENTER XMAX "; XMAX
  990. 'XMAX = NP2 / 2
  991. CALL GRAPH(TIME(), F2R(), NP2, XMIN, XMAX, YMIN, YMAX, 0, FTTITLE$, "TIME", "FILTER")
  992. INPUT DUM$
  993. ERASE FQ, F2, F2R, F2I, FPHASE
  994. END IF
  995. '************************
  996.  
  997.  
  998. FOR I = 0 TO NP2    'CONVERT BACK TO RECTANGULAR BEFORE FFT
  999. RA(I) = CN(I) * COS(PHASEANGLE(I))
  1000. IA(I) = CN(I) * (SIN(PHASEANGLE(I))) * -1
  1001. NEXT I
  1002.  
  1003. CALL FFT(NP2, M, RA(), IA())    'SENDING F DOMAIN, WILL RETURN T DOMAIN
  1004. FOR I = 0 TO NP2
  1005. ENV(I) = (IA(I) ^ 2 + RA(I) ^ 2) ^ .5
  1006. NEXT I
  1007.  
  1008. 'PRINT "READY TO GRAPH HILBERT TRANSFORM"
  1009. 'HILBERT TRANSFORM = IA(I)   'THE SIGNAL = RA(I)
  1010. 'CALL GETMINMAX(TIME(), IA(), NP2, XMIN, XMAX, YMIN, YMAX)
  1011. 'XMAX = TMAX
  1012. 'IF DOFILT THEN
  1013. 'TITLE$ = "HILBERT TRANSFORM OF FILTERED SIGNAL (IA)" + FILTERPOINTS$
  1014. 'ELSE
  1015. 'TITLE$ = "HILBERT TRANSFORM (IA)"
  1016. 'END IF
  1017. 'CALL GRAPH(TIME(), IA(), NP2, XMIN, XMAX, YMIN, YMAX, 0, TITLE$, "TIME (SEC)", "HT(t)",TSCOUNT,)
  1018.  
  1019. CALL GETMINMAX(COUNT(), RA(), NP2, XMIN, XMAX, YMIN, YMAX)
  1020.  
  1021. IF DOFILT THEN
  1022.  
  1023. ELSE
  1024. FSTITLE$ = "THE NEW SIGNAL"
  1025. END IF
  1026.  
  1027. CALL GRAPH(COUNT(), RA(), NP2, XMIN, XMAX, YMIN, YMAX, 0, FSTITLE$, "TIME (SEC)", "S(t)")
  1028.  
  1029. 'PRINT "READ TO GRAPH ENVELOPE"
  1030. 'CALL GETMINMAX(TIME(), ENV(), NP2, XMIN, XMAX, YMIN, YMAX)
  1031. 'XMAX = TMAX
  1032. 'CALL GRAPH(TIME(), ENV(), NP2, XMIN, XMAX, YMIN, YMAX, 0, "ENVELOPE", "TIME (SEC)", "ENV(t)",TSCOUNT,)
  1033.  
  1034. COLOR LIGHTRED%: PRINT "WRITING OUTPUT TO "; OUTPUTFILE$: COLOR GREEN%
  1035. OPEN OUTPUTFILE$ FOR OUTPUT AS #OUTFILENUM
  1036. PRINT #OUTFILENUM, "N", "TIME(N)", "S(N)", "NEW SIGNAL", "FREQ(N)", "Cn", "HILBERT", "ENVELOPE"
  1037. FOR N = 0 TO NP2
  1038. CALL NPRINTFORMAT(N, TMP$): PRINT #OUTFILENUM, USING TMP$; N;
  1039. PRINT #OUTFILENUM, ",";
  1040. CALL NPRINTFORMAT(TIME(N), TMP$): PRINT #OUTFILENUM, USING TMP$; TIME(N);
  1041. PRINT #OUTFILENUM, ",";
  1042. CALL NPRINTFORMAT(S(N), TMP$): PRINT #OUTFILENUM, USING TMP$; S(N);
  1043. PRINT #OUTFILENUM, ",";
  1044. CALL NPRINTFORMAT(RA(N), TMP$): PRINT #OUTFILENUM, USING TMP$; RA(N);
  1045. PRINT #OUTFILENUM, ",";
  1046. CALL NPRINTFORMAT(FREQ(N), TMP$): PRINT #OUTFILENUM, USING TMP$; FREQ(N);
  1047. PRINT #OUTFILENUM, ",";
  1048. CALL NPRINTFORMAT(CN(N), TMP$): PRINT #OUTFILENUM, USING TMP$; CN(N);
  1049. PRINT #OUTFILENUM, ",";
  1050. CALL NPRINTFORMAT(IA(N), TMP$): PRINT #OUTFILENUM, USING TMP$; IA(N);
  1051. PRINT #OUTFILENUM, ",";
  1052. CALL NPRINTFORMAT(ENV(N), TMP$): PRINT #OUTFILENUM, USING TMP$; ENV(N)
  1053. NEXT N
  1054. CLOSE #OUTFILENUM
  1055.  
  1056. END SUB
  1057.  
  1058. REM $STATIC
  1059. SUB FFT (NP2, M, RA(), IA())
  1060.  
  1061. PRINT "BEGINNING FFT AT    "; TIME$
  1062.  
  1063.      REM  FFT AFTER COOLEY AND TUKEY
  1064.      NV = NP2 / 2
  1065.      NM = NP2 - 1
  1066.      J = 1
  1067.      FOR I = 1 TO NM
  1068.      IF I >= J GOTO 2100
  1069.      IT = IA(J)
  1070.      RT = RA(J)
  1071.      RA(J) = RA(I)
  1072.      IA(J) = IA(I)
  1073.      RA(I) = RT
  1074.      IA(I) = IT
  1075. 2100 K = NV
  1076. 2110 IF K >= J GOTO 2150
  1077.      J = J - K
  1078.      K = K / 2
  1079.      GOTO 2110
  1080. 2150 J = J + K
  1081.      NEXT I
  1082.      FOR L = 1 TO M
  1083.      LE = 2 ^ L
  1084.      L1 = LE / 2
  1085.      RU = 1!
  1086.      IU = 0!
  1087.      RW = COS(PI / L1)
  1088.      IW = SIN(PI / L1)
  1089.      FOR J = 1 TO L1
  1090.      FOR I = J TO NP2 STEP LE
  1091.      IP = I + L1
  1092.      RT = RA(IP) * RU - IA(IP) * IU
  1093.      IT = IA(IP) * RU + RA(IP) * IU
  1094.      RA(IP) = RA(I) - RT
  1095.      IA(IP) = IA(I) - IT
  1096.      RA(I) = RA(I) + RT
  1097.      IA(I) = IA(I) + IT
  1098.      NEXT I
  1099.      Q1 = IU * IW
  1100.      Q2 = RU * RW
  1101.      Q3 = IU * RW
  1102.      Q4 = RU * IW
  1103.      RU = Q2 - Q1
  1104.      IU = Q3 + Q4
  1105.      NEXT J
  1106.      NEXT L
  1107.  
  1108. PRINT "ENDED FFT AT    "; TIME$
  1109. END SUB
  1110.  
  1111. SUB FOLDANDSHIFT (IP, SIG(), FOLD())
  1112. 'FOLD THE SIGNAL
  1113. FOR I = 0 TO IP - 1
  1114. FOLD(I) = SIG(IP - 1 - I)
  1115. NEXT I
  1116. END SUB
  1117.  
  1118. SUB GETARRAYSIZE (INPUTFILE$, INFILENUM, XDATATOTAL, YDATATOTAL)
  1119. 'GET NUMBER OF COLUMNS (TO GET XDATA)
  1120. XDATATOTAL = 0: YDATATOTAL = 0: COMMAS = 0: ROWLENGTH = 0
  1121. ROWTOTAL = 0: COLUMNTOTAL = 0: ROWS = 0: COLUMNS = 0
  1122. OPEN INPUTFILE$ FOR INPUT AS #INFILENUM
  1123. LINE INPUT #INFILENUM, ROWLENTH$
  1124. ROWLENGTH = LEN(ROWLENTH$)
  1125.  
  1126. FOR I = 1 TO ROWLENGTH
  1127. IF (MID$(ROWLENTH$, I, 1) = ",") THEN
  1128. COMMAS = COMMAS + 1
  1129. END IF
  1130. NEXT I
  1131.  
  1132. XDATATOTAL = COMMAS + 1
  1133. COLUMNTOTAL = XDATATOTAL
  1134.  
  1135. CLOSE #INFILENUM
  1136.  
  1137. 'GET NUMBER OF ROWS (TO GET YDATA)
  1138. OPEN INPUTFILE$ FOR INPUT AS #INFILENUM
  1139.  
  1140. DO
  1141. IF EOF(INFILENUM) THEN :  EXIT DO
  1142. LINE INPUT #INFILENUM, DUM$
  1143. YDATATOTAL = YDATATOTAL + 1
  1144. LOOP UNTIL EOF(INFILENUM)
  1145.  
  1146. ROWTOTAL = YDATATOTAL
  1147. CLOSE #INFILENUM
  1148.  
  1149. 'INPUT DATA INTO ARRAY
  1150.  
  1151. OPEN INPUTFILE$ FOR INPUT AS #INFILENUM
  1152. REDIM ROWCOLUMN(ROWTOTAL, COLUMNTOTAL)   'Z=(ROW,COLUMN) = Z=(YDATA,XDATA)
  1153. REDIM XYDATA(COLUMNTOTAL, ROWTOTAL)
  1154.  
  1155. FOR ROW = 1 TO ROWTOTAL   'YDATA
  1156. FOR COLUMN = 1 TO COLUMNTOTAL   'XDATA
  1157. IF NOT EOF(INFILENUM) THEN
  1158. INPUT #INFILENUM, ROWCOLUMN(ROW, COLUMN)  'ROWCOLUMN(YDATA,XDATA)
  1159. END IF
  1160. NEXT COLUMN  'XDATA
  1161. NEXT ROW     'YDATA
  1162.  
  1163. ROWS = XDATATOTAL
  1164. COLUMNS = YDATATOTAL
  1165. CLOSE #INFILENUM
  1166.  
  1167. PRINT "XDATATOTAL "; XDATATOTAL
  1168. PRINT "YDATATOTAL "; YDATATOTAL
  1169.  
  1170.  
  1171. END SUB
  1172.  
  1173. SUB GETFILTER (FILT(), FREQ(), NP2, FSTITLE$, FTTITLE$)
  1174. DO
  1175. PRINT "SELECT THE FILTER TYPE"
  1176. PRINT : PRINT "1) LOW PASS"
  1177. PRINT : PRINT "2) HIGH PASS"
  1178. PRINT : PRINT "3) BAND PASS"
  1179. PRINT : INPUT CHOICE%
  1180. LOOP WHILE CHOICE% < 1 OR CHOICE% > 3
  1181.  
  1182. SELECT CASE CHOICE%
  1183. 'FILT(I) = SIN((2 * PI * (FREQ(I) - F0)) / (4 * (F1 - F0)))
  1184. 'FILT(I) = COS((2 * PI * (FREQ(I) - F2)) / (4 * (F3 - F2)))
  1185.  
  1186. CASE 1: ' LOW PASS
  1187. INPUT "F2 IS "; F2
  1188. INPUT "F3 IS "; F3
  1189.  
  1190. FOR I = 0 TO NP2
  1191. IF FREQ(I) < F2 THEN
  1192. FILT(I) = 1
  1193. ELSEIF FREQ(I) <= F3 THEN
  1194. FILT(I) = COS((2 * PI * (FREQ(I) - F2) / (4 * (F3) - F2)))
  1195. ELSE FILT(I) = 0
  1196. END IF
  1197. NEXT I
  1198.  
  1199. FSTITLE$ = "LOW PASS FILTERED SIGNAL" + STR$(F2) + " " + STR$(F3)
  1200. FTTITLE$ = "LOW PASS FILTER" + STR$(F2) + " " + STR$(F3)
  1201.  
  1202. CASE 2:  'HIGH PASS
  1203. INPUT "F0 IS "; F0
  1204. INPUT "F1 IS "; F1
  1205.  
  1206. FOR I = 0 TO NP2
  1207. IF FREQ(I) < F0 THEN
  1208. FILT(I) = 0
  1209. ELSEIF FREQ(I) < F1 THEN
  1210. FILT(I) = SIN((2 * PI * (FREQ(I) - F0)) / (4 * (F1 - F0)))
  1211. ELSE
  1212. FILT(I) = 1
  1213. END IF
  1214. NEXT I
  1215.  
  1216. FSTITLE$ = "HIGH PASS FILTERED SIGNAL" + STR$(F0) + " " + STR$(F1)
  1217. FTTITLE$ = "HIGH PASS FILTER" + STR$(F0) + " " + STR$(F1)
  1218.  
  1219. CASE 3:
  1220. 'INPUT "ENTER  (1.0) "; R$: CALL NIFDEFAULT(R$, DELTAT, 1)
  1221.  
  1222. INPUT "F0 IS (60)  "; R$: CALL NIFDEFAULT(R$, F0, 60)
  1223. INPUT "F1 IS (90)  "; R$: CALL NIFDEFAULT(R$, F1, 90)
  1224. INPUT "F2 IS (120) "; R$: CALL NIFDEFAULT(R$, F2, 120)
  1225. INPUT "F3 IS (175) "; R$: CALL NIFDEFAULT(R$, F3, 175)
  1226.  
  1227. FOR I = 0 TO NP2 * .5
  1228. IF FREQ(I) < F0 OR FREQ(I) > F3 THEN
  1229. FILT(I) = 0
  1230. ELSEIF FREQ(I) < F1 THEN
  1231. FILT(I) = SIN((2 * PI * (FREQ(I) - F0)) / (4 * (F1 - F0)))
  1232. ELSEIF FREQ(I) <= F2 THEN
  1233. FILT(I) = 1
  1234. ELSE
  1235. FILT(I) = COS((2 * PI * (FREQ(I) - F2)) / (4 * (F3 - F2)))
  1236. END IF
  1237. 'CN(I) = CN(I) * FILT(I)
  1238. NEXT I
  1239.  
  1240. FPOINTS$ = STR$(F0) + " " + STR$(F1) + " " + STR$(F2) + " " + STR$(F3)
  1241. FTTITLE$ = "BAND PASS FILTER" + FPOINTS$
  1242. FSTITLE$ = "BAND PASS FILTERED SIGNAL " + FPOINTS$
  1243.  
  1244. END SELECT
  1245. END SUB
  1246.  
  1247. SUB GETINPUTFILE (INPUTFILE$, INFILENUM)
  1248.  
  1249. '''INPUT "ENTER WORKING DIRECTORY "; WORKINGDIR$
  1250. ''FILES WORKINGDIR$ + "\*.*"
  1251. FILES "*.DAT"
  1252. PRINT "ENTER INPUT FILE NAME AND PATH IF NOT IN DEFAULT DIRECTORY "
  1253. INPUT INPUTFILE$
  1254. INPUTFILE$ = WORKINGDIR$ + INPUTFILE$
  1255. PRINT
  1256. INFILENUM = FREEFILE
  1257. OPEN INPUTFILE$ FOR INPUT AS #INFILENUM: CLOSE #INFILENUM
  1258. END SUB
  1259.  
  1260. SUB GETMINMAX (XGET(), YGET(), DATACOUNT, XMIN, XMAX, YMIN, YMAX) STATIC
  1261. XMIN = 0: XMAX = 0: YMIN = 0: YMAX = 0
  1262.  
  1263. PRINT "BEGAN GET GRAPH PARAMS AT    "; TIME$
  1264.                    
  1265. FOR I = (LBOUND(XGET)) TO (UBOUND(XGET))     'GET MIN'S AND MAX'S
  1266. IF XGET(I) < XMIN THEN XMIN = XGET(I)
  1267. IF XGET(I) > XMAX THEN XMAX = XGET(I)
  1268. NEXT I
  1269. FOR I = (LBOUND(YGET)) TO (UBOUND(YGET))
  1270. IF YGET(I) < YMIN THEN YMIN = YGET(I)
  1271. IF YGET(I) > YMAX THEN YMAX = YGET(I)
  1272. NEXT I
  1273.  
  1274.  
  1275. PRINT "XMIN "; XMIN
  1276. PRINT "XMAX "; XMAX
  1277. PRINT "YMIN "; YMIN
  1278. PRINT "YMAX "; YMAX
  1279. 'WAITFORKEY
  1280. PRINT "ENDED GET GRAPH PARAMS AT    "; TIME$
  1281.  
  1282. END SUB
  1283.  
  1284. SUB GETOUTPUTFILE (OUTPUTFILE$, OUTFILENUM)
  1285.  
  1286. FILES
  1287.  
  1288. PRINT "ENTER OUTPUT FILE NAME AND PATH IF NOT IN DEFAULT DIRECTORY "
  1289. INPUT OUTPUTFILE$
  1290. OUTPUTFILE$ = WORKINGDIR$ + OUTPUTFILE$
  1291. PRINT
  1292. OUTFILENUM = FREEFILE
  1293.  
  1294. OPEN OUTPUTFILE$ FOR OUTPUT AS #OUTFILENUM: CLOSE #OUTFILENUM
  1295. END SUB
  1296.  
  1297. SUB GETPOWEROFTWO (NP, M, NP2)
  1298. 'SUB GETPOWEROFTWO (NP, M, NP2)
  1299. M = 0
  1300. COUNT = 2
  1301. DO
  1302. ITESTVAL = 2 ^ COUNT
  1303. IF (ITESTVAL >= NP) AND (NP >= 4) THEN
  1304.         NP2 = ITESTVAL
  1305.         'M = COUNT
  1306.         M = COUNT + 1
  1307.         NP2 = 2 ^ M
  1308.         EXIT DO
  1309. END IF
  1310. COUNT = COUNT + 1
  1311. LOOP WHILE ITESTVAL <= NP
  1312. END SUB
  1313.  
  1314. SUB GRAPH (X(), Y(), DATATOTAL, XMIN, XMAX, YMIN, YMAX, PLOTPOINT%, TITLE$, XAXIS$, YAXIS$) STATIC
  1315. 'PLOTPOINT% :   0 = NO POINTS, > 0 YES POINTS , > 1 SPIKE
  1316. SCREEN 12: WIDTH 80, 60: CLS 0:  XF = 1: YF = 4 / 3  'SF = 4 / 3:
  1317. FORECOLOR% = CYAN%: COLOR FORECOLOR%: XSTOP = 0
  1318. CIRCLERADIUS = (.0045 * (XMAX - XMIN))
  1319. LXTOPX% = 0: LYTOPY% = 1: PXTOLX% = 2: PYTOLY% = 3
  1320. 'X AXIS FROM COL 11 TO COL 73 FOR A TOTAL OF 63 COLUMNS (504 PIX)
  1321. XEND = XMAX: YEND = YMAX
  1322.  
  1323. NUMBEROFXTICKLABLES = 63 / 9   '= 7 X DATA LABLES, EACH 9 COLUMNS WIDE
  1324. YINTERVAL% = 9             '45 ROWS (9 Y LABLES)
  1325. 'XINTERVAL = NUMBEROFXTICKLABLES
  1326. XSTEP = (XMAX - XMIN) / (NUMBEROFXTICKLABLES - 1) '=LOGICAL PIXELS PER COLUMN
  1327. YSTEP = (YMAX - YMIN) / YINTERVAL%
  1328.  
  1329. LXPIXELTOCOL = 63 / (XMAX - XMIN)            '63=504/8
  1330. X1 = XMIN: Y1 = YMAX           'UPPER LEFT
  1331. X2 = XMAX: Y2 = YMIN           'LOWER RIGHT
  1332. Y1 = Y1 * YF: Y2 = Y2 * YF
  1333.  
  1334. ' 1 TO 58 ROWS          WIDTH 80,60
  1335. ' 1 TO 78 COLUMNS       WIDTH 80,60
  1336.  
  1337. PIXPERROW = 8: PIXPERCOL = 8
  1338.  
  1339. VUX% = 80: VUY% = 40: VLX% = 584: VLY% = 408       'VLX%=580
  1340. VIEW (VUX%, VUY%)-(VLX%, VLY%)
  1341. VXRANGE% = VLX% - VUX%: VYRANGE = VLY% - VUY%
  1342. LXRANGE = ABS(XMAX - XMIN): LYRANGE = ABS(YMAX - YMIN)
  1343. VYRANGE = VYRANGE * YF
  1344. XTOV = LXRANGE / VXRANGE%: YTOV = LYRANGE / VYRANGE
  1345. WXPIX% = 504: WYPIX% = 367
  1346. WX1 = X1 - 1 * 8 * XTOV: WY1 = Y1 + 16 * YTOV
  1347. WX2 = X2 + 1 * 8 * XTOV: WY2 = Y2 - 16 * YTOV
  1348. COLUMNSTART% = 11: COLUMNEND = 73: TOTALPHYSCOLS = 63
  1349.  
  1350. '  YROWSTART% = 7: YROWEND = 51  '45 ROWS
  1351. YROWSTART% = 7: YROWEND% = 56    '50 ROWS
  1352. WINDOW (WX1, WY1)-(WX2, WY2)
  1353.  
  1354. 'LINE (WX1, WY1)-(WX2, WY2), GREEN, B   'GREEN BOX DEFINES PHYSICAL WINDOW
  1355. LINE (X1, Y1)-(X2, Y2), LIGHTBLUE%, B         'BLUE% BOX DEFINES LOGICAL WINDOW
  1356.  
  1357. COLOR RED%
  1358. LOCATE 1, 1: PRINT COMMONTITLE$
  1359. CALL SCENTER(84, NEWCOL, TITLE$): LOCATE 3, NEWCOL:  PRINT TITLE$
  1360. CALL SCENTER(84, NEWCOL, XAXISTITLE$): LOCATE 58, NEWCOL: PRINT XAXIS$
  1361. LOCATE 19, 1: PRINT YAXIS$
  1362. COLOR FORECOLOR
  1363.  
  1364. COLOR FORECOLOR%
  1365. XROW = 54: COUNT = 0
  1366. FOR I = X1 TO X2 STEP XSTEP  ' X AXIS TICK MARKS
  1367. LINE (I, Y2)-(I, WY2)
  1368. XCOL = 5 + I * LXPIXELTOCOL
  1369. IF I = X1 THEN : XCOL = 4 + I * LXPIXELTOCOL
  1370. 'CALL NCENTER(XROW, XCOL, I)
  1371. CALL NPRINTFORMAT(I, TMP$)
  1372. CALL IFEVEN(COUNT, EVENORODD)  ' 2 IF EVEN, 1 IF ODD
  1373. IF EVENORODD = 2 THEN
  1374. XROW = 54
  1375. ELSE
  1376. XROW = 56
  1377. END IF
  1378. LOCATE XROW, XCOL: PRINT USING TMP$; I
  1379. COUNT = COUNT + 1
  1380. NEXT I
  1381.  
  1382. IF COUNT < 7 THEN 'BE SURE THAT XMAX PLOTS
  1383. I = X2: XROW = 54
  1384. LINE (I, Y2)-(I, WY2)
  1385. XCOL = 5 + I * LXPIXELTOCOL
  1386. CALL NPRINTFORMAT(I, TMP$)
  1387. LOCATE XROW, XCOL: PRINT USING TMP$; I
  1388. END IF
  1389.  
  1390. 'COLOR GREEN%
  1391. COUNT = 0                       'Y AXIS
  1392. 'IF YMIN >= 0 THEN               ' IF THERE IS NO ZERO FOR THE Y DATA
  1393. YDATAP = YMAX
  1394. FOR ROW = YROWSTART% TO YROWEND% STEP 5       ' 2
  1395. CALL NPRINTFORMAT(YDATAP, TMP$)
  1396. LOCATE ROW, 1:  PRINT USING TMP$; YDATAP
  1397. LINE (X1, YDATAP * YF)-(WX1, YDATAP * YF)
  1398. YDATAP = YDATAP - YSTEP  ' - (5 * YSTEP)
  1399. 'IF YDATAP < Y1 THEN : EXIT FOR
  1400. COUNT = COUNT + 1
  1401. NEXT ROW
  1402. IF YDATAP < YMIN THEN
  1403. LINE (X1, YMIN * YF)-(WX1, YMIN * YF)
  1404. END IF
  1405. 'END IF
  1406.  
  1407. IF COUNT < 9 THEN
  1408. YDATAP = Y2: ROW = 51
  1409. CALL NPRINTFORMAT(YDATAP, TMP$)
  1410. LOCATE ROW, 1:  PRINT USING TMP$; YDATAP
  1411. LINE (X1, YDATAP)-(WX1, YDATAP)
  1412. END IF
  1413.  
  1414. COLOR RED%     'ZERO LINES
  1415. LINE (WX1, 0)-(XMAX, 0), LIGHTBLUE%  'Y ZERO LINE
  1416. 'LINE (0, YMIN * YF)-(0, YMAX * YF), GREEN   'X ZERO LINE
  1417.  
  1418. COLOR LIGHTGREEN%                        'PLOT THE DATA POINTS
  1419.  
  1420. XSTOP = DATATOTAL - 1
  1421. 'XSTOP = XMAX
  1422. 'FOR I = XMIN TO DATATOTAL
  1423. FOR I = LBOUND(X) TO XSTOP
  1424. 'FOR I = XMIN TO XSTOP
  1425.  
  1426. IF X(I) > XMAX THEN : EXIT FOR
  1427. PSET (X(I) * XF, YF * Y(I))
  1428. IF PLOTPOINT% > 0 THEN
  1429. CIRCLE (X(I) * XF, YF * Y(I)), CIRCLERADIUS, MAGENTA
  1430. PAINT (X(I) * XF, YF * Y(I)), MAGENTA
  1431. END IF
  1432. NEXT I
  1433.  
  1434. IF PLOTPOINT% < 2 THEN
  1435. COLOR LIGHTRED%                         'CONNECT THE POINTS
  1436. FOR I = LBOUND(X) TO XSTOP - 1
  1437. IF X(I) > XMAX THEN : EXIT FOR
  1438. LINE (X(I), YF * Y(I))-(X(I + 1), YF * Y(I + 1))
  1439. NEXT I
  1440.  
  1441. ELSE  ' SPIKE THE DATA
  1442.  
  1443. FOR I = LBOUND(X) TO XMAX
  1444. IF X(I) > XMAX THEN : EXIT FOR
  1445. LINE (X(I), YF * Y(I))-(X(I), 0)
  1446. NEXT I
  1447. END IF
  1448.  
  1449. DUM$ = INPUT$(1)
  1450. VIEW: CLS 0
  1451. SCREEN 0
  1452. END SUB
  1453.  
  1454. REM $DYNAMIC
  1455. SUB GRAPHTEST
  1456.  
  1457. DO
  1458. CLS
  1459. DATACOUNT = 0: XDATATOTAL = 0: YDATATOTAL = 0
  1460.  
  1461. CALL GETINPUTFILE(INPUTFILE$, INFILENUM)
  1462. CALL GETARRAYSIZE(INPUTFILE$, INFILENUM, XDATATOTAL, YDATATOTAL)
  1463. DATACOUNT = YDATATOTAL - 1
  1464. REDIM X(0 TO DATACOUNT), Y(0 TO DATACOUNT)
  1465.  
  1466.  
  1467. 'INFILENUM = FREEFILE
  1468. OPEN INPUTFILE$ FOR INPUT AS #INFILENUM
  1469. IF XDATATOTAL = 1 THEN
  1470. FOR I = 0 TO DATACOUNT
  1471. INPUT #INFILENUM, Y(I)
  1472. X(I) = I
  1473. NEXT I
  1474. ELSE
  1475. FOR I = 0 TO DATACOUNT
  1476. INPUT #INFILENUM, X(I), Y(I)
  1477. NEXT I
  1478. END IF
  1479. CLOSE #INFILENUM
  1480.  
  1481. CALL GETMINMAX(X(), Y(), DATACOUNT, XMIN, XMAX, YMIN, YMAX)
  1482.  
  1483. PRINT "LBX "; LBOUND(X); " = "; X(LBOUND(X))
  1484. PRINT "UBX "; UBOUND(X); " = "; X(UBOUND(X))
  1485. PRINT "LBY "; LBOUND(Y); " = "; Y(LBOUND(Y))
  1486. PRINT "UBY "; UBOUND(Y); " = "; Y(UBOUND(Y))
  1487. 'WAITFORKEY
  1488. CALL GRAPH(X(), Y(), DATACOUNT, XMIN, XMAX, YMIN, YMAX, 0, T$, X$, Y$)
  1489.  
  1490.  
  1491. INPUT "AGAIN "; YORN$
  1492. IF UCASE$(YORN$) <> "Y" THEN : EXIT DO
  1493. LOOP
  1494.  
  1495. END SUB
  1496.  
  1497. REM $STATIC
  1498. SUB GWHILBERT (HILBERTTRANSFORM(), W())
  1499. FOR I = LBOUND(HILBERTTRANSFORM) TO UBOUND(HILBERTTRANSFORM)
  1500. IF W(I) > 0 THEN
  1501. HILBERTTRANSFORM(I) = 2 * HILBERTTRANSFORM(I)
  1502. ELSEIF W(I) = 0 THEN
  1503. HILBERTTRANSFORM(I) = HILBERTTRANSFORM(I)
  1504. ELSE
  1505. HILBERTTRANSFORM(I) = 0  ' FOR W(I) < 0
  1506. END IF
  1507. NEXT I
  1508. END SUB
  1509.  
  1510. SUB HARM (A(), M(), INV(), S(), ifset, IFERR)
  1511.  'SUB HARM (a(), M%(), INV%(), S(), ifset%, IFERR%)
  1512. PRINT "STARTING HARM AT "; TIME$: INPUT DUM$
  1513. PRINT "IFSET IS "; ifset: INPUT DUM$
  1514.  
  1515. 'DEFINT I-N
  1516. DIM NP(3), W(3), W2(3), W3(3)    'I ADDED THIS
  1517. 10 IF (ABS(ifset) - 1) <= 1 THEN GOTO 900 ELSE GOTO 12
  1518. 12        mtt = 0
  1519.         FOR J = 1 TO 3
  1520.         PRINT "M "; J; " IS "; M(J)
  1521.         IF M(J) > mtt THEN mtt = M(J)
  1522.         NEXT J
  1523.         mtt = mtt - 2
  1524.       ROOT2 = SQR(2!)
  1525.       IF mtt < 2 THEN GOTO 13 ELSE GOTO 14
  1526.       IF mtt > 12 THEN GOTO 13 ELSE GOTO 14
  1527. 13 IFERR = 1
  1528.       PRINT "mtt is "; mtt
  1529.       PRINT "np too large or too small": INPUT DUM$
  1530.       GOTO 1000
  1531. 14 IFERR = 0
  1532.       M1 = M(1)
  1533.       M2 = M(2)
  1534.       M3 = M(3)
  1535.       N1 = 2 ^ M1
  1536.       N2 = 2 ^ M2
  1537.       N3 = 2 ^ M3
  1538. 16 IF ifset <= 0 THEN GOTO 18 ELSE GOTO 20
  1539. 18 NX = N1 * N2 * N3
  1540.       QQN = NX
  1541.       FOR I = 1 TO NX
  1542.       A(2 * I - 1) = A(2 * I - 1) / QQN
  1543. 19 A(2 * I) = -A(2 * I) / QQN
  1544.       NEXT I
  1545. 20 NP(1) = N1 * 2
  1546.       NP(2) = NP(1) * N2
  1547.       NP(3) = NP(2) * N3
  1548.       FOR id = 1 TO 3       'end 250
  1549.       IL = NP(3) - NP(id)
  1550.       IL1 = IL + 1
  1551.       MI = M(id)
  1552.       IF MI <= 0 THEN GOTO 250
  1553. 30 IDIF = NP(id)
  1554.       KBIT = NP(id)
  1555.       MEV = 2 * (MI / 2)
  1556.       IF (MI - MEV) <= 0 THEN GOTO 60
  1557. 40 KBIT = KBIT / 2
  1558.       KL = KBIT - 2
  1559.       FOR I = 1 TO IL1 STEP IDIF  'end 50
  1560.       KLAST = KL + I
  1561.       FOR K = I TO KLAST STEP 2      'end 50
  1562.       KD = K + KBIT
  1563.       T = A(KD)
  1564.       A(KD) = A(K) - T
  1565.       A(K) = A(K) + T
  1566.       T = A(KD + 1)
  1567.       A(KD + 1) = A(K + 1) - T
  1568. 50 A(K + 1) = A(K + 1) + T
  1569.       NEXT K
  1570.       NEXT I
  1571.       IF (MI - 1) <= 0 THEN GOTO 250 ELSE GOTO 52
  1572. 52 LFIRST = 3
  1573.       JLAST = 1
  1574.       GOTO 70
  1575. 60 LFIRST = 2
  1576.       JLAST = 0
  1577. 70 FOR L = LFIRST TO MI STEP 2          'end 240
  1578.       JJDIF = KBIT
  1579.       KBIT = KBIT / 4
  1580.       KL = KBIT - 2
  1581.       FOR I = 1 TO IL1 STEP IDIF        'end 80
  1582.       KLAST = I + KL
  1583.       FOR K = I TO KLAST STEP 2            'end 80
  1584.       K1 = K + KBIT
  1585.       K2 = K1 + KBIT
  1586.       K3 = K2 + KBIT
  1587.       T = A(K2)
  1588.       A(K2) = A(K) - T
  1589.       A(K) = A(K) + T
  1590.       T = A(K2 + 1)
  1591.       A(K2 + 1) = A(K + 1) - T
  1592.       A(K + 1) = A(K + 1) + T
  1593.       T = A(K3)
  1594.       A(K3) = A(K1) - T
  1595.       A(K1) = A(K1) + T
  1596.       T = A(K3 + 1)
  1597.       A(K3 + 1) = A(K1 + 1) - T
  1598.       A(K1 + 1) = A(K1 + 1) + T
  1599.       T = A(K1)
  1600.       A(K1) = A(K) - T
  1601.       A(K) = A(K) + T
  1602.       T = A(K1 + 1)
  1603.       A(K1 + 1) = A(K + 1) - T
  1604.       A(K + 1) = A(K + 1) + T
  1605.       R = -A(K3 + 1)
  1606.       T = A(K3)
  1607.       A(K3) = A(K2) - R
  1608.       A(K2) = A(K2) + R
  1609.       A(K3 + 1) = A(K2 + 1) - T
  1610. 80 A(K2 + 1) = A(K2 + 1) + T
  1611.       NEXT K
  1612.       NEXT I
  1613.       IF JLAST <= 0 THEN GOTO 235
  1614. 82 JJ = JJDIF + 1
  1615.       ILAST = IL + JJ
  1616.       FOR I = JJ TO ILAST STEP IDIF            'end 85
  1617.       KLAST = KL + I
  1618.       FOR K = I TO KLAST STEP 2                 'end 85
  1619.       K1 = K + KBIT
  1620.       K2 = K1 + KBIT
  1621.       K3 = K2 + KBIT
  1622.       R = -A(K2 + 1)
  1623.       T = A(K2)
  1624.       A(K2) = A(K) - R
  1625.       A(K) = A(K) + R
  1626.       A(K2 + 1) = A(K + 1) - T
  1627.       A(K + 1) = A(K + 1) + T
  1628.       AWR = A(K1) - A(K1 + 1)
  1629.       AWI = A(K1 + 1) + A(K1)
  1630.       R = -A(K3) - A(K3 + 1)
  1631.       T = A(K3) - A(K3 + 1)
  1632.       A(K3) = (AWR - R) / ROOT2
  1633.       A(K3 + 1) = (AWI - T) / ROOT2
  1634.       A(K1) = (AWR + R) / ROOT2
  1635.       A(K1 + 1) = (AWI + T) / ROOT2
  1636.       T = A(K1)
  1637.       A(K1) = A(K) - T
  1638.       A(K) = A(K) + T
  1639.       T = A(K1 + 1)
  1640.       A(K1 + 1) = A(K + 1) - T
  1641.       A(K + 1) = A(K + 1) + T
  1642.       R = -A(K3 + 1)
  1643.       T = A(K3)
  1644.       A(K3) = A(K2) - R
  1645.       A(K2) = A(K2) + R
  1646.       A(K3 + 1) = A(K2 + 1) - T
  1647. 85 A(K2 + 1) = A(K2 + 1) + T
  1648.       NEXT K
  1649.       NEXT I
  1650.       IF (JLAST - 1) <= 0 THEN GOTO 235 ELSE GOTO 90
  1651. 90 JJ = JJ + JJDIF
  1652.       FOR J = 2 TO JLAST           'end 230
  1653. 96 I = INV(J + 1)
  1654. 98 IC = NT - I
  1655.       W(1) = S(IC)
  1656.       W(2) = S(I)
  1657.       I2 = 2 * I
  1658.       i2c = NT - I2
  1659.       IF i2c < 0 THEN GOTO 120
  1660.       IF i2c = 0 THEN GOTO 110 ELSE GOTO 100
  1661. 100 W2(1) = S(i2c)
  1662.       W2(2) = S(I2)
  1663.       GOTO 130
  1664. 110 W2(1) = 0!
  1665.       W2(2) = 1!
  1666.       GOTO 130
  1667. 120 I2CC = i2c + NT
  1668.       i2c = -i2c
  1669.       W2(1) = -S(i2c)
  1670.       W2(2) = S(I2CC)
  1671. 130 I3 = I + I2
  1672.       I3C = NT - I3
  1673.       IF I3C < 0 THEN GOTO 160
  1674.       IF I3C = 0 THEN GOTO 150 ELSE GOTO 140
  1675. 140 W3(1) = S(I3C)
  1676.       W3(2) = S(I3)
  1677.       GOTO 200
  1678. 150 W3(1) = 0!
  1679.       W3(2) = 1!
  1680.       GOTO 200
  1681. 160 i3cc = I3C + NT
  1682.       IF i3cc < 0 THEN GOTO 190
  1683.       IF i3cc = 0 THEN GOTO 180 ELSE 170
  1684. 170 I3C = -I3C
  1685.       W3(1) = -S(I3C)
  1686.       W3(2) = S(i3cc)
  1687.       GOTO 200
  1688. 180 W3(1) = -1!
  1689.       W3(2) = 0!
  1690.       GOTO 200
  1691. 190 I3CCC = NT + i3cc
  1692.       i3cc = -i3cc
  1693.       W3(1) = -S(I3CCC)
  1694.       W3(2) = -S(i3cc)
  1695. 200 ILAST = IL + JJ
  1696.       FOR I = JJ TO ILAST STEP IDIF       'end 220
  1697.       KLAST = KL + I
  1698.       FOR K = I TO KLAST STEP 2          'end 220
  1699.       K1 = K + KBIT
  1700.       K2 = K1 + KBIT
  1701.       K3 = K2 + KBIT
  1702.       R = A(K2) * W2(1) - A(K2 + 1) * W2(2)
  1703.       T = A(K2) * W2(2) + A(K2 + 1) * W2(1)
  1704.       A(K2) = A(K) - R
  1705.       A(K) = A(K) + R
  1706.       A(K2 + 1) = A(K + 1) - T
  1707.       A(K + 1) = A(K + 1) + T
  1708.       R = A(K3) * W3(1) - A(K3 + 1) * W3(2)
  1709.       T = A(K3) * W3(2) + A(K3 + 1) * W3(1)
  1710.       AWR = A(K1) * W(1) - A(K1 + 1) * W(2)
  1711.       AWI = A(K1) * W(2) + A(K1 + 1) * W(1)
  1712.       A(K3) = AWR - R
  1713.       A(K3 + 1) = AWI - T
  1714.       A(K1) = AWR + R
  1715.       A(K1 + 1) = AWI + T
  1716.       T = A(K1)
  1717.       A(K1) = A(K) - T
  1718.       A(K) = A(K) + T
  1719.       T = A(K1 + 1)
  1720.       A(K1 + 1) = A(K + 1) - T
  1721.       A(K + 1) = A(K + 1) + T
  1722.       R = -A(K3 + 1)
  1723.       T = A(K3)
  1724.       A(K3) = A(K2) - R
  1725.       A(K2) = A(K2) + R
  1726.       A(K3 + 1) = A(K2 + 1) - T
  1727. 220 A(K2 + 1) = A(K2 + 1) + T
  1728.        NEXT K
  1729.        NEXT I
  1730. 230 JJ = JJDIF + JJ
  1731.         NEXT J
  1732. 235 JLAST = 4 * JLAST + 3
  1733. REM   240 CONTINUE
  1734.       NEXT L
  1735. 250   NEXT id
  1736. REM   250 CONTINUE
  1737.       NTSQ = NT * NT
  1738.       M3MT = M3 - mt
  1739. 350 IF M3MT < 0 THEN GOTO 370
  1740. 360 igo3 = 1
  1741.       N3VNT = N3 / NT
  1742.       MINN3 = NT
  1743.       GOTO 380
  1744. 370 igo3 = 2
  1745.       N3VNT = 1
  1746.       NTVN3 = NT / N3
  1747.       MINN3 = N3
  1748. 380 JJD3 = NTSQ / N3
  1749.       M2MT = M2 - mt
  1750. 450 IF M2MT < 0 THEN GOTO 470
  1751. 460 igo2 = 1
  1752.       N2VNT = N2 / NT
  1753.       MINN2 = NT
  1754.       GOTO 480
  1755. 470 igo2 = 2
  1756.       N2VNT = 1
  1757.       NTVN2 = NT / N2
  1758.       MINN2 = N2
  1759. 480 JJD2 = NTSQ / N2
  1760.       M1MT = M1 - mt
  1761. 550 IF M1MT < 0 THEN GOTO 570
  1762. 560 igo1 = 1
  1763.       N1VNT = N1 / NT
  1764.       MINN1 = NT
  1765.       GOTO 580
  1766. 570 igo1 = 2
  1767.       N1VNT = 1
  1768.       NTVN1 = NT / N1
  1769.       MINN1 = N1
  1770. 580 JJD1 = NTSQ / N1
  1771. 600 JJ3 = 1
  1772.       J = 1
  1773.       FOR jpp3 = 1 TO N3VNT     'end 880
  1774.       IPP3 = INV(JJ3)
  1775.       FOR jp3 = 1 TO MINN3     'end 870
  1776.       IF igo3 = 2 THEN GOTO 620        'GO TO (610,620),IGO3
  1777. 610 IP3 = INV(jp3) * N3VNT
  1778.       GOTO 630
  1779. 620 IP3 = INV(jp3) / NTVN3
  1780. 630 I3 = (IPP3 + IP3) * N2
  1781. 700 JJ2 = 1
  1782.       FOR jpp2 = 1 TO N2VNT       'end 870
  1783.       IPP2 = INV(JJ2) + I3
  1784.       FOR jp2 = 1 TO MINN2        'end 860
  1785.       IF igo2 = 2 THEN GOTO 720    'GO TO (710,720),IGO2
  1786. 710 IP2 = INV(jp2) * N2VNT
  1787.       GOTO 730
  1788. 720 IP2 = INV(jp2) / NTVN2
  1789. 730 I2 = (IPP2 + IP2) * N1
  1790. 800 JJ1 = 1
  1791.       FOR jpp1 = 1 TO N1VNT           'end 860
  1792.       IPP1 = INV(JJ1) + I2
  1793.       FOR jp1 = 1 TO MINN1            'end 850
  1794.       IF igo1 = 2 THEN GOTO 820 ELSE GOTO 810  'GO TO (810,820),IGO1
  1795. 810 IP1 = INV(jp1) * N1VNT
  1796.       GOTO 830
  1797. 820 IP1 = INV(jp1) / NTVN1
  1798. 830 I = 2 * (IPP1 + IP1) + 1
  1799.       IF (J - I) < 0 THEN GOTO 840 ELSE GOTO 845
  1800. 840 T = A(I)
  1801.       A(I) = A(J)
  1802.       A(J) = T
  1803.       T = A(I + 1)
  1804.       A(I + 1) = A(J + 1)
  1805.       A(J + 1) = T
  1806. 845 AQAQ = 2
  1807. 850 J = J + 2
  1808.     NEXT jp1
  1809. 860 JJ1 = JJ1 + JJD1
  1810.     NEXT jpp1
  1811.     NEXT jp2
  1812. 870 JJ2 = JJ2 + JJD2
  1813.     NEXT jpp2
  1814.     NEXT jp3
  1815. 880 JJ3 = JJ3 + JJD3
  1816.     NEXT jpp3
  1817. 890 IF ifset < 0 THEN GOTO 891 ELSE GOTO 895
  1818. 891 FOR I = 1 TO NX               'end 892
  1819. 892 A(2 * I) = -A(2 * I)
  1820.     NEXT I
  1821. 895 GOTO 1000
  1822. 900 mt = M(1) - 2: IFERR = 0
  1823.       NT = 2 ^ mt
  1824.       NTV2 = NT / 2
  1825. 910 THETA = .7853981634#
  1826.       JSTEP = NT
  1827.       JDIF = NTV2
  1828.       S(JDIF) = SIN(THETA)
  1829.       FOR L = 2 TO mt     'end 950
  1830.       THETA = THETA / 2!
  1831.       JSTEP2 = JSTEP
  1832.       JSTEP = JDIF
  1833.       JDIF = JSTEP / 2
  1834.       S(JDIF) = SIN(THETA)
  1835.       JC1 = NT - JDIF
  1836.       S(JC1) = COS(THETA)
  1837.       JLAST = NT - JSTEP2
  1838.       IF (JLAST - JSTEP) < 0 THEN GOTO 950
  1839. 920 FOR J = JSTEP TO JLAST STEP JSTEP        'end 940
  1840.       JC = NT - J
  1841.       JD = J + JDIF
  1842. 940 S(JD) = S(J) * S(JC1) + S(JDIF) * S(JC)
  1843.      NEXT J
  1844. REM  950 CONTINUE
  1845. 950  NEXT L
  1846. 960  MTLEXP = NTV2
  1847.       LM1EXP = 1
  1848.       INV(1) = 0
  1849.       FOR L = 1 TO mt    'end 980
  1850.       INV(LM1EXP + 1) = MTLEXP
  1851.       FOR J = 2 TO LM1EXP      'end 970
  1852.       JJ = J + LM1EXP
  1853. 970 INV(JJ) = INV(J) + MTLEXP
  1854.       NEXT J
  1855.       MTLEXP = MTLEXP / 2
  1856. 980 LM1EXP = LM1EXP * 2
  1857.      NEXT L
  1858. 982 IF ifset = 0 THEN GOTO 895 ELSE GOTO 12
  1859. 1000 AQAQ = 3
  1860.  
  1861. PRINT "ENDING HARM AT "; TIME$: INPUT DUM$
  1862. END SUB
  1863.  
  1864. SUB IFEVEN (NUM1, EVENORODD) ' 2 IF EVEN, 1 IF ODD
  1865. NUM2 = NUM1 MOD 2
  1866. IF NUM2 = 0 THEN : EVENORODD = 2: EXIT SUB
  1867. EVENORODD = 1
  1868. END SUB
  1869.  
  1870. SUB LEASTDELTA (XGET(), LEAST)
  1871. LEAST = XGET(UBOUND(XGET)) - XGET(LBOUND(XGET))
  1872. FOR I = (LBOUND(XGET)) TO (UBOUND(XGET) - 1)
  1873. TEST = (XGET(I + 1) - XGET(I))
  1874. IF TEST < LEAST THEN LEAST = TEST
  1875. NEXT I
  1876. END SUB
  1877.  
  1878. FUNCTION LN (X)
  1879. IF X > 0 THEN
  1880. LN = LOG(X)
  1881. ELSE
  1882. PRINT "CANNOT TAKE LN(X<0)"
  1883. EXIT FUNCTION
  1884. END IF
  1885. END FUNCTION
  1886.  
  1887. SUB MATCHFILTER
  1888. 'NOTE:  SINCE THE CONVOLUTION ROUTINE I'M USING FOLDS THE 2nd SIGNAL, I
  1889. '       NEED TO FOLD THE 2nd SIGNAL IN THE CORRELATION ROUTINE BEFORE
  1890. '       I SEND IT TO THE CONVOLUTION IN ORDER TO REVERSE THE EFFECTS OF
  1891. '       THE FOLDING IN THE CONVOLUTION ! BUT, WITH THE MATCH FILTER, WE
  1892. '       WANT TO FOLD THE 2nd SIGNAL!  SO IN THIS MATCH FILTER ROUTINE,
  1893. '       THE FOLDING IS DONE ONLY FOR THE PURPOSE OF DISPLAYING THE
  1894. '       GRAPH OF THE FOLD !
  1895.  
  1896. SNP = 0: GNP = 0: ISNP = 0: IGNP = 0: CONTOTAL = 0: DIVISOR = 1
  1897. PRINT "MATCH FILTER"
  1898. PRINT "SOLVE FOR h(t) = s(t) * g(t)"
  1899. PRINT "FOR THE SIGNAL S(t)"
  1900. CALL GETINPUTFILE(INPUTFILE$, INFILENUM)
  1901. SINPUTFILE$ = INPUTFILE$: SINFILENUM = INFILENUM
  1902. CALL GETOUTPUTFILE(OUTPUTFILE$, OUTFILENUM)
  1903. 'INPUTFILE$ = "S.DAT"
  1904. CALL GETARRAYSIZE(SINPUTFILE$, SINFILENUM, XDATATOTAL, YDATATOTAL)
  1905. ISNP = YDATATOTAL - 1
  1906. PRINT "ISNP,YT "; ISNP, YDATATOTAL
  1907.  
  1908. PRINT "FOR THE SIGNAL G(t-T)"
  1909. CALL GETINPUTFILE(INPUTFILE$, INFILENUM)
  1910. GINPUTFILE$ = INPUTFILE$: GINFILENUM = INFILENUM
  1911. CALL GETARRAYSIZE(GINPUTFILE$, GINFILENUM, XDATATOTAL, YDATATOTAL)
  1912. IGNP = YDATATOTAL - 1
  1913. PRINT "IGNP, YT "; IGNP, YDATATOTAL
  1914.  
  1915. '**************************************
  1916.  
  1917. IF ISNP < IGNP THEN
  1918. GNP = IGNP
  1919. SNP = GNP
  1920. ELSEIF IGNP < ISNP THEN
  1921. SNP = ISNP
  1922. GNP = SNP
  1923. ELSE
  1924. SNP = ISNP
  1925. GNP = SNP
  1926. END IF
  1927. PRINT "ISNP "; ISNP; " IGNP "; IGNP; " SNP "; SNP; " GNP "; GNP
  1928.  
  1929. START% = 0
  1930. REDIM S(START% TO SNP), SCOUNT(START% TO SNP), CON(START% TO SNP * 2)
  1931. REDIM G(START% TO GNP), GCOUNT(START% TO GNP), GFOLD(START% TO GNP)
  1932.  
  1933. FOR I = 0 TO SNP - 1
  1934. SCOUNT(I) = I
  1935. GCOUNT(I) = I
  1936. NEXT I
  1937.  
  1938. IF ISNP < IGNP THEN
  1939. FOR I = ISNP + 1 TO GNP
  1940. S(I) = 0
  1941. NEXT I
  1942. ELSEIF IGNP < ISNP THEN
  1943. FOR I = IGNP + 1 TO SNP
  1944. G(I) = 0
  1945. NEXT I
  1946. END IF
  1947.  
  1948. PRINT "ISNP "; ISNP; " SNP "; SNP
  1949. PRINT "IGNP "; IGNP; " GNP "; GNP
  1950.  
  1951. OPEN SINPUTFILE$ FOR INPUT AS #SINFILENUM
  1952. FOR I = 0 TO ISNP - 1
  1953. INPUT #SINFILENUM, S(I)    'THE SIGNAL
  1954. NEXT I
  1955. CLOSE #SINFILENUM
  1956.  
  1957. OPEN GINPUTFILE$ FOR INPUT AS #GINFILENUM
  1958. FOR I = 0 TO IGNP - 1
  1959. INPUT #GINFILENUM, G(I)    'THE SIGNAL
  1960. NEXT I
  1961. CLOSE #GINFILENUM
  1962.  
  1963. COLOR RED%: PRINT "WORKING...": COLOR GREEN%
  1964.  
  1965. CALL FOLDANDSHIFT(GNP, G(), GFOLD())
  1966.  
  1967. 'PRINT "I", "S", "G", "GF"
  1968. 'FOR I = 0 TO SNP - 1
  1969. 'PRINT I, S(I), G(I), GFOLD(I)
  1970. 'NEXT I
  1971.  
  1972. '*****************************************
  1973. LX = SNP: LB = GNP
  1974. LY = 0: LY = LX + LB: CONTOTAL = LY
  1975. REDIM LX(1 TO LX), LB(1 TO LB), CY(1 TO LY)
  1976.  
  1977. PRINT "LX "; LX; " LB "; LB; " LY "; LY
  1978. REDIM CONCOUNT(0 TO CONTOTAL)
  1979. FOR I = 0 TO CONTOTAL - 1
  1980. CONCOUNT(I) = I
  1981. NEXT I
  1982. FOR I = 1 TO SNP
  1983. LX(I) = S(I - 1)
  1984. LB(I) = G(I - 1)
  1985. NEXT I
  1986.  
  1987. FOR I = 1 TO LX
  1988. FOR J = 1 TO LB
  1989. CY(I + J - 1) = CY(I + J - 1) + LX(I) * LB(J)
  1990. NEXT J
  1991. NEXT I
  1992. PRINT "IN NEWCONV"
  1993. 'FOR I = 1 TO 2 * SNP
  1994. 'PRINT CY(I)
  1995. 'NEXT I
  1996. FOR I = 0 TO SNP * 2 - 1
  1997. CON(I) = CY(I + 1)
  1998. NEXT I
  1999. ERASE CY, LX, LB
  2000. '*****************************************
  2001.  
  2002. PRINT "ISNP "; ISNP; " SNP "; SNP
  2003. PRINT "IGNP "; IGNP; " GNP "; GNP
  2004. PRINT "CONTOTAL "; CONTOTAL
  2005. INPUT DUM$
  2006.  
  2007. PRINT "OUTPUT WRITTEN TO "; OUTPUTFILE$
  2008. OPEN OUTPUTFILE$ FOR OUTPUT AS #OUTFILENUM
  2009.  
  2010. PRINT #OUTFILENUM, "I", , "S(I)", "G(I)"
  2011. TMP$ = "############.#######"
  2012. FOR I = 1 TO ISNP
  2013. PRINT #OUTFILENUM, I,
  2014. PRINT #OUTFILENUM, USING TMP$; S(I); G(I)
  2015. NEXT I
  2016. PRINT #OUTFILENUM, "I", "CON(I)"
  2017. FOR I = 1 TO CONTOTAL
  2018. PRINT #OUTFILENUM, I,
  2019. PRINT #OUTFILENUM, USING TMP$; CON(I)
  2020. NEXT I
  2021. CLOSE
  2022.  
  2023. PRINT "READY TO GRAPH S(t)"
  2024. P = SNP
  2025. CALL GETMINMAX(SCOUNT(), S(), P, XMIN, XMAX, YMIN, YMAX)
  2026. 'INPUT DUM$
  2027. TITLE$ = "S(t)"
  2028. YTITLE$ = "S(t)"
  2029. XTITLE$ = "POINT COUNT"
  2030. CALL GRAPH(SCOUNT(), S(), P, XMIN, XMAX, YMIN, YMAX, 0, TITLE$, XTITLE$, YTITLE$)
  2031.  
  2032. PRINT "READY TO GRAPH g(t)"
  2033. P = GNP
  2034. CALL GETMINMAX(GCOUNT(), G(), P, XMIN, XMAX, YMIN, YMAX)
  2035. TITLE$ = "g(t)"
  2036. YTITLE$ = "g(t)"
  2037. XTITLE$ = "POINT COUNT"
  2038. CALL GRAPH(GCOUNT(), G(), P, XMIN, XMAX, YMIN, YMAX, 0, TITLE$, XTITLE$, YTITLE$)
  2039.  
  2040. PRINT "READY TO GRAPH THE FOLDED SIGNAL"
  2041. P = GNP
  2042. CALL GETMINMAX(GCOUNT(), GFOLD(), P, XMIN, XMAX, YMIN, YMAX)
  2043. TITLE$ = "G(t) FOLDED"
  2044. YTITLE$ = "G(t) FOLDED"
  2045. XTITLE$ = "POINT COUNT"
  2046. CALL GRAPH(GCOUNT(), GFOLD(), P, XMIN, XMAX, YMIN, YMAX, 0, TITLE$, XTITLE$, YTITLE$)
  2047.  
  2048.  
  2049. PRINT "READY TO GRAPH THE CONVOLUTION MATCH FILTER"
  2050. 'LINE INPUT "ENTER THE TITLE "; TITLE$
  2051. TITLE$ = "MATCH FILTER OF "
  2052. INPUT "MATCH FILTER OF "; TCC$
  2053. TITLE$ = TITLE$ + TCC$
  2054.  
  2055. CALL GETMINMAX(CONCOUNT(), CON(), CONTOTAL, XMIN, XMAX, YMIN, YMAX)
  2056. PRINT "CONTOTAL "; CONTOTAL
  2057. PRINT "XMIN "; XMIN
  2058. PRINT "XMAX "; XMAX
  2059. 'TITLE$ = "CONVOLUTION p(t)=s(t) * g(t)"
  2060. YTITLE$ = "P(t)"
  2061. XTITLE$ = ""
  2062. CALL GRAPH(CONCOUNT(), CON(), CONTOTAL, XMIN, XMAX, YMIN, YMAX, 0, TITLE$, XTITLE$, YTITLE$)
  2063.  
  2064. 'WAITFORKEY
  2065. ERASE S, SCOUNT, CON, G, GCOUNT
  2066.  
  2067. END SUB
  2068.  
  2069. SUB MENUSIGNALPRO
  2070. CLS : DO: COLOR GREEN%: PRINT
  2071.  
  2072. PRINT : PRINT " 1) AMPLITUDE SPECTRUM"
  2073. PRINT : PRINT " 2) FAST FOURIER TRANSFORM"
  2074. PRINT : PRINT " 3) BAND PASS FILTER"
  2075. PRINT : PRINT " 4) CONVOLUTION"
  2076. PRINT : PRINT " 5) LOW PASS FILTER BY CONVOLUTION"
  2077. PRINT : PRINT " 6) CROSS CORRELATION"
  2078. PRINT : PRINT " 7) MATCH FILTER"
  2079. PRINT : PRINT " 8) DIMENSIONAL TRANSFORMS"
  2080. PRINT : PRINT " 9) DE-GHOSTING"
  2081. PRINT : PRINT "10) QUIT THIS MENU"
  2082. PRINT : INPUT "ENTER A NUMBER TO INDICATE YOUR CHOICE "; CHOICE%
  2083.  
  2084. SELECT CASE CHOICE%
  2085.         CASE 1:
  2086.  
  2087.  
  2088.         CASE 2:
  2089.         CALL GETINPUTFILE(INPUTFILE$, INFILENUM)
  2090.         CALL GETOUTPUTFILE(OUTPUTFILE$, OUTFILENUM)
  2091.         CALL GETARRAYSIZE(INPUTFILE$, INFILENUM, XDATATOTAL, YDATATOTAL)
  2092.         NP = YDATATOTAL - 1
  2093.         CALL FASTFOURIER(INPUTFILE$, INFILENUM, OUTPUTFILE$, OUTFILENUM, NP)
  2094.                
  2095.         CASE 3:
  2096.      
  2097. 'CALL BANDPASSFILTER(S(), TIME(), CN(), FREQ(), RA(), IA(), PHASEANGLE(), NP2)
  2098.  
  2099.         CASE 4:   CALL CONVOLUTION
  2100.       
  2101.         CASE 5:    'FILTER BY CONVOLUTION
  2102.                        
  2103.         CALL GETINPUTFILE(INPUTFILE$, INFILENUM)
  2104.         CALL GETOUTPUTFILE(OUTPUTFILE$, OUTFILENUM)
  2105.         CALL GETARRAYSIZE(INPUTFILE$, INFILENUM, XDATATOTAL, YDATATOTAL)
  2106.         NP = YDATATOTAL - 1
  2107. INPUT "ENTER THE SAMPLE RATE IN MSEC (1.0) "; R$: CALL NIFDEFAULT(R$, DELTAT, 1)
  2108.         DELTAT = DELTAT * .001
  2109.         
  2110.                        
  2111.                         ISNP = NP
  2112.                         REDIM S(0 TO ISNP - 1), FILT(0 TO ISNP - 1)
  2113.                         REDIM FOLD(0 TO ISNP - 1), CON(0 TO ISNP * 2)
  2114.                         REDIM CONCOUNT(0 TO ISNP * 2)
  2115.                         INFILENUM = FREEFILE
  2116.                         OPEN INPUTFILE$ FOR INPUT AS #INFILENUM
  2117.                         FOR I = 0 TO ISNP - 1
  2118.                         INPUT #INFILENUM, S(I)
  2119.                         NEXT I
  2120.                         CLOSE #INFILENUM
  2121.  
  2122.                         CALL SINCLPF(ISNP, DELTAT, FILT())
  2123.                        
  2124.                         FOR I = ISNP + 1 TO NP2 - 1
  2125.                         FILT(I) = 0
  2126.                         S(I) = 0
  2127.                         NEXT I
  2128.                        
  2129.                 CALL FOLDANDSHIFT(ISNP, FILT(), FOLD())
  2130.                
  2131.                 CALL NEWCONV(ISNP, ISNP, S(), FILT(), FOLD(), CON(), CONCOUNT())
  2132.    
  2133.         CASE 6:
  2134.                 CALL CROSSCORRELATION
  2135.        
  2136.                  
  2137.  
  2138.         CASE 7:
  2139.                 CALL MATCHFILTER
  2140.  
  2141.         CASE 8:
  2142.                  CALL DIMTRANSFORM
  2143.  
  2144.         CASE 9:
  2145.                ' COLOR 9
  2146.                ' PRINT "TYPE EXIT TO RETURN TO PROGRAM"
  2147.                ' SHELL
  2148.                ' COLOR 2
  2149.                 CALL DEGHOST
  2150.  
  2151.       
  2152.         CASE 10: DONE = TRUE
  2153.                 
  2154.             
  2155. END SELECT       'SELECT CASE CHOICE
  2156. LOOP UNTIL DONE
  2157.  
  2158.  
  2159. END SUB
  2160.  
  2161. SUB NCENTER (ROW, NEWCOL, NUMBERLABLE)
  2162. 'x% = x% + Down%
  2163. NEWCOL = INT((NEWCOL - LEN(NUMBERLABLE)) / 2)
  2164. 'LOCATE ROW, COLUMN: PRINT NUMBERLABLE
  2165. END SUB
  2166.  
  2167. REM $DYNAMIC
  2168. SUB NEWCONV (ISNP, IGNP, S(), G(), GF(), CON(), CONCOUNT())
  2169. 'THE ARRAYS S(), G(), AND GF() MUST BE THE SAME SIZE BEFORE THEY GET HERE
  2170. IF ISNP < IGNP THEN
  2171. GNP = IGNP
  2172. SNP = GNP
  2173. PRINT "ISNP < IGNP"
  2174. ELSEIF IGNP < ISNP THEN
  2175. SNP = ISNP
  2176. GNP = SNP
  2177. PRINT "IGNP < ISNP"
  2178. ELSE
  2179. PRINT "ISNP=IGNP"
  2180. SNP = ISNP
  2181. GNP = SNP
  2182. END IF
  2183.  
  2184. PRINT "ISNP "; ISNP; " IGNP "; IGNP; " SNP "; SNP; " GNP "; GNP
  2185.  
  2186. REDIM GCOUNT(0 TO GNP - 1), SCOUNT(0 TO SNP - 1)
  2187.  
  2188. IF ISNP < IGNP THEN
  2189. FOR I = ISNP + 1 TO GNP - 1
  2190. S(I) = 0
  2191. NEXT I
  2192. ELSEIF IGNP < ISNP THEN
  2193. FOR I = IGNP + 1 TO SNP - 1
  2194. G(I) = 0
  2195. NEXT I
  2196. END IF
  2197.  
  2198. PRINT "ISNP "; ISNP; " SNP "; SNP
  2199. PRINT "IGNP "; IGNP; " GNP "; GNP
  2200.  
  2201. FOR I = 0 TO SNP - 1
  2202. SCOUNT(I) = I
  2203. GCOUNT(I) = I
  2204. NEXT I
  2205.  
  2206. '*****************************************
  2207. LX = SNP: LB = GNP
  2208. LY = 0: LY = LX + LB: CONTOTAL = LY
  2209. REDIM LX(1 TO LX), LB(1 TO LB), CY(1 TO LY)
  2210.  
  2211. PRINT "LX "; LX; " LB "; LB; " LY "; LY
  2212. PRINT "CONTOTAL "; CONTOTAL
  2213. 'INPUT DUM$
  2214. REDIM CONCOUNT(0 TO CONTOTAL)
  2215. FOR I = 0 TO CONTOTAL
  2216. CONCOUNT(I) = I
  2217. NEXT I
  2218. FOR I = 1 TO SNP
  2219. LX(I) = S(I - 1)
  2220. LB(I) = G(I - 1)
  2221. NEXT I
  2222.  
  2223. TMP$ = "###.###": STARTTIME$ = TIME$
  2224. COUNT = 0
  2225. FOR I = 1 TO LX
  2226. FOR J = 1 TO LB
  2227. CY(I + J - 1) = CY(I + J - 1) + LX(I) * LB(J)
  2228. COUNT = COUNT + 1
  2229. NEXT J
  2230. CLS
  2231. PRINT "STARTED CONVOLUTION AT "; STARTTIME$
  2232. PRINT USING TMP$; COUNT / (SNP * .5 * CONTOTAL) * 100;
  2233. PRINT " % COMPLETED"
  2234. NEXT I
  2235. PRINT "ENDED CONVOLUTION AT "; TIME$
  2236. PRINT "NUMBER OF CONVOLUTION CALCULATIONS "; COUNT
  2237. FOR I = 0 TO SNP * 2 - 1
  2238. CON(I) = CY(I + 1)
  2239. NEXT I
  2240. ERASE CY, LX, LB
  2241.  
  2242. 'PRINT "CONTOTAL "; CONTOTAL: INPUT DUM$
  2243. '*****************************************
  2244. 'PRINT "READY TO GRAPH S(t)"
  2245. 'P = SNP
  2246. 'CALL GETMINMAX(SCOUNT(), S(), P, XMIN, XMAX, YMIN, YMAX)
  2247. 'TITLE$ = "S(t)"
  2248. 'YTITLE$ = "S(t)"
  2249. 'XTITLE$ = "POINT COUNT"
  2250. 'CALL GRAPH(SCOUNT(), S(), P, XMIN, XMAX, YMIN, YMAX, 0, TITLE$, XTITLE$, YTITLE$,TSCOUNT,)
  2251.  
  2252. 'PRINT "READY TO GRAPH g(t)"
  2253. 'P = GNP
  2254. 'CALL GETMINMAX(GCOUNT(), G(), P, XMIN, XMAX, YMIN, YMAX)
  2255. 'TITLE$ = "g(t)"
  2256. 'YTITLE$ = "g(t)"
  2257. 'XTITLE$ = "POINT COUNT"
  2258. 'CALL GRAPH(GCOUNT(), G(), P, XMIN, XMAX, YMIN, YMAX, 0, TITLE$, XTITLE$, YTITLE$,TSCOUNT,)
  2259.  
  2260. 'PRINT "READY TO GRAPH THE FOLDED SIGNAL"
  2261. 'P = GNP
  2262. 'CALL GETMINMAX(GCOUNT(), GF(), P, XMIN, XMAX, YMIN, YMAX)
  2263. 'TITLE$ = "G(t) FOLDED"
  2264. 'YTITLE$ = "G(t) FOLDED"
  2265. 'XTITLE$ = "POINT COUNT"
  2266. 'CALL GRAPH(GCOUNT(), GF(), P, XMIN, XMAX, YMIN, YMAX, 0, TITLE$, XTITLE$, YTITLE$,TSCOUNT,)
  2267.  
  2268. 'PRINT "READY TO GRAPH THE CONVOLUTION"
  2269. 'LINE INPUT "ENTER THE TITLE "; TITLE$
  2270. 'CALL GETMINMAX(CONCOUNT(), CON(), CONTOTAL - 1, XMIN, XMAX, YMIN, YMAX)
  2271. 'PRINT "CONTOTAL "; CONTOTAL
  2272. 'PRINT "XMIN "; XMIN
  2273. 'PRINT "XMAX "; XMAX
  2274. 'TITLE$ = "CONVOLUTION p(t)=s(t) * g(t)"
  2275. 'YTITLE$ = "P(t)"
  2276. 'XTITLE$ = ""
  2277. 'CALL GRAPH(CONCOUNT(), CON(), CONTOTAL - 1, XMIN, XMAX, YMIN, YMAX, 0, TITLE$, XTITLE$, YTITLE$,TSCOUNT,)
  2278.  
  2279. ERASE SCOUNT, GCOUNT
  2280. END SUB
  2281.  
  2282. REM $STATIC
  2283. SUB NEWCONVOLUTION
  2284. SNP = 0: GNP = 0: ISNP = 0: IGNP = 0: CONTOTAL = 0: DIVISOR = 1
  2285. PRINT "SOLVE FOR h(t) = s(t) * g(t)"
  2286. PRINT "FOR THE SIGNAL S(t)"
  2287. CALL GETINPUTFILE(INPUTFILE$, INFILENUM)
  2288. SINPUTFILE$ = INPUTFILE$: SINFILENUM = INFILENUM
  2289. CALL GETOUTPUTFILE(OUTPUTFILE$, OUTFILENUM)
  2290. 'INPUTFILE$ = "S.DAT"
  2291. CALL GETARRAYSIZE(SINPUTFILE$, SINFILENUM, XDATATOTAL, YDATATOTAL)
  2292. ISNP = YDATATOTAL - 1
  2293. PRINT "ISNP,YT "; ISNP, YDATATOTAL
  2294.  
  2295. PRINT "FOR THE SIGNAL G(t-T)"
  2296. CALL GETINPUTFILE(INPUTFILE$, INFILENUM)
  2297. GINPUTFILE$ = INPUTFILE$: GINFILENUM = INFILENUM
  2298. CALL GETARRAYSIZE(GINPUTFILE$, GINFILENUM, XDATATOTAL, YDATATOTAL)
  2299. IGNP = YDATATOTAL - 1
  2300. PRINT "IGNP, YT "; IGNP, YDATATOTAL
  2301.  
  2302. '**************************************
  2303.  
  2304. IF ISNP < IGNP THEN
  2305. GNP = IGNP
  2306. SNP = GNP
  2307. ELSEIF IGNP < ISNP THEN
  2308. SNP = ISNP
  2309. GNP = SNP
  2310. ELSE
  2311. SNP = ISNP
  2312. GNP = SNP
  2313. END IF
  2314. PRINT "ISNP "; ISNP; " IGNP "; IGNP; " SNP "; SNP; " GNP "; GNP
  2315.  
  2316. START% = 0
  2317. REDIM S(START% TO SNP), SCOUNT(START% TO SNP), CON(START% TO SNP * 2)
  2318. REDIM G(START% TO GNP), GCOUNT(START% TO GNP), GFOLD(START% TO GNP)
  2319.  
  2320. FOR I = 0 TO SNP - 1
  2321. SCOUNT(I) = I
  2322. GCOUNT(I) = I
  2323. NEXT I
  2324.  
  2325. IF ISNP < IGNP THEN
  2326. FOR I = ISNP + 1 TO GNP
  2327. S(I) = 0
  2328. NEXT I
  2329. ELSEIF IGNP < ISNP THEN
  2330. FOR I = IGNP + 1 TO SNP
  2331. G(I) = 0
  2332. NEXT I
  2333. END IF
  2334.  
  2335. PRINT "ISNP "; ISNP; " SNP "; SNP
  2336. PRINT "IGNP "; IGNP; " GNP "; GNP
  2337.  
  2338. OPEN SINPUTFILE$ FOR INPUT AS #SINFILENUM
  2339. FOR I = 0 TO ISNP - 1
  2340. INPUT #SINFILENUM, S(I)    'THE SIGNAL
  2341. NEXT I
  2342. CLOSE #SINFILENUM
  2343.  
  2344. OPEN GINPUTFILE$ FOR INPUT AS #GINFILENUM
  2345. FOR I = 0 TO IGNP - 1
  2346. INPUT #GINFILENUM, G(I)    'THE SIGNAL
  2347. NEXT I
  2348. CLOSE #GINFILENUM
  2349.  
  2350. COLOR RED%: PRINT "WORKING...": COLOR GREEN%
  2351. CALL FOLDANDSHIFT(GNP, G(), GFOLD())
  2352.  
  2353. PRINT "I", "S", "G", "GF"
  2354. FOR I = 0 TO SNP - 1
  2355. PRINT I, S(I), G(I), GFOLD(I)
  2356. NEXT I
  2357.  
  2358. '*****************************************
  2359. LX = SNP: LB = GNP
  2360. LY = 0: LY = LX + LB: CONTOTAL = LY
  2361. REDIM LX(1 TO LX), LB(1 TO LB), CY(1 TO LY)
  2362.  
  2363. PRINT "LX "; LX; " LB "; LB; " LY "; LY
  2364. REDIM CONCOUNT(0 TO CONTOTAL)
  2365. FOR I = 0 TO CONTOTAL - 1
  2366. CONCOUNT(I) = I
  2367. NEXT I
  2368. FOR I = 1 TO SNP
  2369. LX(I) = S(I - 1)
  2370. LB(I) = G(I - 1)
  2371. NEXT I
  2372.  
  2373. FOR I = 1 TO LX
  2374. FOR J = 1 TO LB
  2375. CY(I + J - 1) = CY(I + J - 1) + LX(I) * LB(J)
  2376. NEXT J
  2377. NEXT I
  2378. PRINT "IN NEWCONV"
  2379. FOR I = 1 TO 2 * SNP
  2380. PRINT CY(I)
  2381. NEXT I
  2382. FOR I = 0 TO SNP * 2 - 1
  2383. CON(I) = CY(I + 1)
  2384. NEXT I
  2385. ERASE CY, LX, LB
  2386. '*****************************************
  2387.  
  2388. PRINT "ISNP "; ISNP; " SNP "; SNP
  2389. PRINT "IGNP "; IGNP; " GNP "; GNP
  2390. PRINT "CONTOTAL "; CONTOTAL
  2391. INPUT DUM$
  2392.  
  2393. PRINT "OUTPUT WRITTEN TO "; OUTPUTFILE$
  2394. OPEN OUTPUTFILE$ FOR OUTPUT AS #OUTFILENUM
  2395.  
  2396. PRINT #OUTFILENUM, "I", , "S(I)", "G(I)"
  2397. TMP$ = "############.#######"
  2398. FOR I = 1 TO ISNP
  2399. PRINT #OUTFILENUM, I,
  2400. PRINT #OUTFILENUM, USING TMP$; S(I); G(I)
  2401. NEXT I
  2402. PRINT #OUTFILENUM, "I", "CON(I)"
  2403. FOR I = 1 TO CONTOTAL
  2404. PRINT #OUTFILENUM, I,
  2405. PRINT #OUTFILENUM, USING TMP$; CON(I)
  2406. NEXT I
  2407. CLOSE
  2408.  
  2409. PRINT "READY TO GRAPH S(t)"
  2410. P = SNP
  2411. CALL GETMINMAX(SCOUNT(), S(), P, XMIN, XMAX, YMIN, YMAX)
  2412. 'INPUT DUM$
  2413. TITLE$ = "S(t)"
  2414. YTITLE$ = "S(t)"
  2415. XTITLE$ = "POINT COUNT"
  2416. CALL GRAPH(SCOUNT(), S(), P, XMIN, XMAX, YMIN, YMAX, 0, TITLE$, XTITLE$, YTITLE$)
  2417.  
  2418. PRINT "READY TO GRAPH g(t)"
  2419. P = GNP
  2420. CALL GETMINMAX(GCOUNT(), G(), P, XMIN, XMAX, YMIN, YMAX)
  2421. TITLE$ = "g(t)"
  2422. YTITLE$ = "g(t)"
  2423. XTITLE$ = "POINT COUNT"
  2424. CALL GRAPH(GCOUNT(), G(), P, XMIN, XMAX, YMIN, YMAX, 0, TITLE$, XTITLE$, YTITLE$)
  2425.  
  2426. PRINT "READY TO GRAPH THE FOLDED SIGNAL"
  2427. P = GNP
  2428. CALL GETMINMAX(GCOUNT(), GFOLD(), P, XMIN, XMAX, YMIN, YMAX)
  2429. TITLE$ = "G(t) FOLDED"
  2430. YTITLE$ = "G(t) FOLDED"
  2431. XTITLE$ = "POINT COUNT"
  2432. CALL GRAPH(GCOUNT(), GFOLD(), P, XMIN, XMAX, YMIN, YMAX, 0, TITLE$, XTITLE$, YTITLE$)
  2433.  
  2434.  
  2435. PRINT "READY TO GRAPH THE CONVOLUTION"
  2436. 'LINE INPUT "ENTER THE TITLE "; TITLE$
  2437. TITLE$ = "Trace1 * f(t), f0 = 40 Hz"
  2438. CALL GETMINMAX(CONCOUNT(), CON(), CONTOTAL, XMIN, XMAX, YMIN, YMAX)
  2439. PRINT "CONTOTAL "; CONTOTAL
  2440. PRINT "XMIN "; XMIN
  2441. PRINT "XMAX "; XMAX
  2442. 'TITLE$ = "CONVOLUTION p(t)=s(t) * g(t)"
  2443. YTITLE$ = "P(t)"
  2444. XTITLE$ = ""
  2445. CALL GRAPH(CONCOUNT(), CON(), CONTOTAL, XMIN, XMAX, YMIN, YMAX, 0, TITLE$, XTITLE$, YTITLE$)
  2446.  
  2447.  
  2448. 'WAITFORKEY
  2449. ERASE S, SCOUNT, CON, G, GCOUNT
  2450. END SUB
  2451.  
  2452. SUB NEWFOLD (IP, SIG(), FOLD())
  2453. M = 1
  2454. FOR J = IP TO 1 STEP -1
  2455. FOLD(M) = SIG(J)
  2456. M = M + 1
  2457. NEXT J
  2458.  
  2459.  
  2460.  
  2461. END SUB
  2462.  
  2463. SUB NIFDEFAULT (R$, R, DEFAULTVAL)
  2464. 'CALL NIFDEFAULT(R$, DELTAT, 1)
  2465.  
  2466. IF R$ = "" THEN
  2467. R = DEFAULTVAL: EXIT SUB
  2468. ELSE
  2469. R = VAL(R$)
  2470. END IF
  2471. END SUB
  2472.  
  2473. SUB NPRINTFORMAT (NUM, PRNFMT$)
  2474. NUM$ = STR$(NUM)
  2475. TEST = ABS(NUM)
  2476. IF TEST = 0 THEN
  2477. PRNFMT$ = "#########": EXIT SUB
  2478. 'ELSEIF NUM < .00001 THEN
  2479. 'NUM = 0
  2480. 'PRNFMT$ = "#": EXIT SUB
  2481. ELSEIF TEST < .0001 THEN
  2482. PRNFMT$ = "##.##^^^^": EXIT SUB
  2483. ELSEIF TEST < 1 THEN
  2484. PRNFMT$ = "##.######": EXIT SUB
  2485. ELSEIF TEST < 10000 THEN
  2486. PRNFMT$ = "#####.###": EXIT SUB
  2487. ELSEIF TEST < 100000 THEN
  2488. PRNFMT$ = "######.##": EXIT SUB
  2489. ELSEIF TEST < 1000000 THEN
  2490. PRNFMT$ = "##.##^^^^": EXIT SUB
  2491. ELSE
  2492. PRNFMT$ = "##.#^^^^^": EXIT SUB
  2493. END IF
  2494.  
  2495. END SUB
  2496.  
  2497. SUB PAGE STATIC
  2498.  
  2499. PAGECOUNT = PAGECOUNT + 1
  2500. IF PAGECOUNT = 15 THEN
  2501. WAITFORKEY
  2502. PAGECOUNT = 0
  2503. CLS
  2504. END IF
  2505.  
  2506. END SUB
  2507.  
  2508. SUB PHASE (A, B, PHI)
  2509.  
  2510. IF B = 0 THEN
  2511.         IF A = 0 THEN PHI = 0: EXIT SUB
  2512.         IF A >= 0 THEN PHI = PI / 2: EXIT SUB
  2513.         IF A < 0 THEN PHI = (3 / 2) * PI: EXIT SUB
  2514. ELSEIF A >= 0 THEN
  2515.         IF B > 0 THEN PHI = ATN(A / B): EXIT SUB
  2516.         IF B < 0 THEN PHI = PI + ATN(A / B): EXIT SUB
  2517. ELSEIF A < 0 THEN
  2518.         IF B > 0 THEN PHI = 2 * PI + ATN(A / B): EXIT SUB
  2519.         IF B < 0 THEN PHI = PI + ATN(A / B): EXIT SUB
  2520. END IF
  2521.  
  2522. 'IF (A = 0 AND B = 0) THEN PHI = 0: EXIT SUB
  2523. 'IF A > 0 AND B = 0 THEN PHI = PI / 2: EXIT SUB
  2524. 'IF A < 0 AND B = 0 THEN PHI = (3 / 2 * PI): EXIT SUB
  2525.  
  2526. 'IF A >= 0 AND B > 0 THEN              'QUAD 1
  2527. 'PHI = ATN(A / B): EXIT SUB
  2528.  
  2529. 'ELSEIF A >= 0 AND B = 0 THEN
  2530. 'PHI = PI / 2
  2531.  
  2532. 'ELSEIF A < 0 AND B > 0 THEN          'QUAD 2
  2533. 'PHI = 2 * PI + ATN(A / B): EXIT SUB
  2534.  
  2535. 'ELSEIF A < 0 AND B < 0 THEN          'QUAD 3
  2536. 'PHI = PI + ATN(A / B): EXIT SUB
  2537.  
  2538. 'ELSEIF (A > 0) AND (B < 0) THEN           'QUAD 4
  2539. 'PHI = PI + ATN(A / B): EXIT SUB
  2540.  
  2541. 'END IF
  2542.  
  2543.  
  2544. END SUB
  2545.  
  2546. SUB PRINTCENTERED (S$, WIDE%)
  2547. L% = LEN(S$)
  2548. IF L% >= WIDE% THEN : EXIT SUB
  2549.  
  2550.  
  2551. S$ = SPACE$((WIDE% - L%) / 2) + S$
  2552.  
  2553.  
  2554. END SUB
  2555.  
  2556. SUB RESETALL
  2557.  
  2558. ROWLENGTH = 0
  2559. ROWLENGTH$ = "0"
  2560. DATACOUNT = 0
  2561. XDATATOTAL = 0
  2562. YDATATOTAL = 0
  2563. COMMAS = 0
  2564. ROWS = 0
  2565. COLUMNS = 0
  2566. ROWTOTAL = 0
  2567. COLUMNTOTAL = 0
  2568. XCOUNT = 0
  2569. YCOUNT = 0
  2570. XMIN = 0
  2571. XMAX = 0
  2572. YMIN = 0
  2573. YMAX = 0
  2574. SUM = 0
  2575. TMP = 0
  2576.  
  2577.  
  2578. END SUB
  2579.  
  2580. SUB SCENTER (OLDCOL, NEWCOL, LABLE$)
  2581. NEWCOL = INT((OLDCOL - LEN(LABLE$)) / 2)
  2582. END SUB
  2583.  
  2584. SUB SCREENTEST
  2585.  
  2586.  
  2587. SCREEN 12
  2588. WIDTH 80, 60
  2589. VIEW (1, 1)-(639, 479)
  2590.  
  2591. FOR ROW = 1 TO 58  '58 ROWS TOTAL
  2592. LOCATE ROW, 1: PRINT ROW
  2593. NEXT ROW
  2594.  
  2595. FOR COL = 3 TO 78 STEP 15     '78 COLS
  2596. LOCATE 58, COL: PRINT 0
  2597. NEXT COL
  2598.  
  2599. 'LOCATE 2, 35: PRINT "TITLE"
  2600. 'LOCATE 28, 35: PRINT "X AXIS"
  2601. 'LOCATE 12, 1: PRINT "Y"
  2602.  
  2603.  
  2604.  
  2605.  
  2606. WAITFORKEY
  2607. SCREEN 0
  2608.  
  2609. END SUB
  2610.  
  2611. SUB SEISMO2 (NEWMODEL)
  2612. '***********************  GET E(t)
  2613. DEL$ = CHR$(127)
  2614. PIE$ = CHR$(227)
  2615. PHI$ = CHR$(237)
  2616. RHO$ = CHR$(235)
  2617.  
  2618. NLAYERS = 0:
  2619.  
  2620. PRINT "PHI "; PHI$; " DEL "; DEL$; " PI "; PIE$
  2621.  
  2622. IF NEWMODEL THEN
  2623. 'INPUT "ENTER DELTA T IN SECONDS "; DELTAT
  2624. INPUT "ENTER THE NUMBER OF LAYERS INCLUDING THE HALF SPACE "; NLAYERS
  2625. REDIM V(0 TO NLAYERS), H(0 TO NLAYERS), D(0 TO NLAYERS), R(0 TO NLAYERS)
  2626. REDIM REFF(0 TO NLAYERS), TWT(0 TO NLAYERS), J(0 TO NLAYERS + 2)
  2627. REDIM E(0 TO NLAYERS)
  2628.  
  2629. FOR I = 0 TO NLAYERS - 1
  2630. PRINT "FOR LAYER # "; I; : INPUT " ENTER THE VELOCITY  "; V(I)
  2631. INPUT "                            ENTER THE THICKNESS "; H(I)
  2632. INPUT "                            ENTER THE DENSITY   "; D(I)
  2633. NEXT I
  2634. INPUT "FOR THE HALF-SPACE, ENTER THE VELOCITY "; V(NLAYERS)
  2635. INPUT "                    ENTER THE DENSITY  "; D(NLAYERS)
  2636. INPUT "                    THICKNESS (10000)  "; R$
  2637. CALL NIFDEFAULT(R$, H(NLAYERS), 10000)
  2638. ELSE
  2639. PRINT "MODEL DATA FILE NEEDS V,RHO,H (EX.  SM1.DAT)"
  2640. INPUT "ENTER THE FILE NAME OF THE MODEL DATA "; INFMOD$
  2641. INF = FREEFILE
  2642. OPEN INFMOD$ FOR INPUT AS #INF
  2643. INPUT #INF, NLAYERS
  2644. REDIM V(0 TO NLAYERS), H(0 TO NLAYERS), D(0 TO NLAYERS), R(0 TO NLAYERS)
  2645. REDIM REFF(0 TO NLAYERS), TWT(0 TO NLAYERS - 1), J(0 TO NLAYERS)
  2646. REDIM E(0 TO NP2)
  2647.  
  2648. FOR I = 1 TO NLAYERS
  2649. INPUT #INF, V(I), D(I), H(I)
  2650. NEXT I
  2651. CLOSE #INF
  2652. END IF
  2653.  
  2654. INPUT "ENTER OUTPUT FILE NAME "; OUTF$
  2655.  
  2656.  
  2657. '********************************
  2658. PRINT "NUMBER OF LAYERS "; NLAYERS
  2659. PRINT "V", "RHO", "H"
  2660. FOR I = 1 TO NLAYERS
  2661. PRINT V(I), D(I), H(I)
  2662. NEXT I
  2663.  
  2664. 'FIND REFLECTION COEFFICIENTS
  2665. FOR N = 1 TO NLAYERS - 1
  2666. R(N) = (D(N + 1) * V(N + 1) - D(N) * V(N)) / (D(N + 1) * V(N + 1) + D(N) * V(N))
  2667. NEXT N
  2668.  
  2669. 'FIND THE EFFECTIVE REFLECTION COEFFICIENTS
  2670. FOR N = 1 TO NLAYERS - 1
  2671. PROD = 0: TEMP = 1
  2672. FOR J = 1 TO N - 1
  2673. PROD = 1 - R(J) ^ 2
  2674. TEMP = PROD * TEMP
  2675. NEXT J
  2676. REFF(N) = TEMP * R(N)
  2677. NEXT N
  2678. PRINT "I", "R", "Reff"
  2679. FOR I = 1 TO NLAYERS - 1
  2680. PRINT I, R(I), REFF(I)
  2681. NEXT I
  2682.  
  2683. 'FIND TWO WAY TRAVEL TIMES
  2684. COUNT = 0
  2685. FOR N = 1 TO NLAYERS - 1
  2686. SUM = 0: COUNT = COUNT + 1
  2687. FOR I = 1 TO COUNT
  2688. SUM = H(I) / V(I) * 2 + SUM
  2689. NEXT I
  2690. TWT(N) = SUM
  2691. NEXT N
  2692. PRINT "LAYER", "TWT"
  2693. FOR I = 1 TO NLAYERS - 1
  2694. PRINT I, TWT(I)
  2695. NEXT I
  2696. 'INPUT DUM$
  2697. '*******************
  2698.  
  2699. '******************************* BP FILTER
  2700. REDIM F(0 TO 3)
  2701. 'INPUT "F0 IS "; F(0)
  2702. 'INPUT "F1 IS "; F(1)
  2703. 'INPUT "F2 IS "; F(2)
  2704. 'INPUT "F3 IS "; F(3)
  2705. DO
  2706. PRINT "ENTER THE BAND FILTER PARAMETERS"
  2707. PRINT "(1) SM1.DAT USES 60, 90, 120, 175"
  2708. PRINT "(2) SM2.DAT USES 30, 60, 100, 200"
  2709. INPUT CHOICE%
  2710. IF CHOICE% = 1 THEN
  2711. F(0) = 60: F(1) = 90: F(2) = 120: F(3) = 175         'SM1
  2712. ELSE
  2713. F(0) = 30: F(1) = 60: F(2) = 100: F(3) = 200          'SM2
  2714. END IF
  2715. LOOP WHILE CHOICE% < 1 OR CHOICE% > 2
  2716.  
  2717. PRINT "ENTER A PHASE (0, "; PIE$; "/2, "; PIE$; ")"
  2718. INPUT "ENTER A PHASE (0) "; R$: CALL NIFDEFAULT(R$, PHI, 0)
  2719.  
  2720. FMAX = 2 * F(3)
  2721.  
  2722. 'IF FMAX < 500 THEN
  2723. 'PRINT "FMAX = "; FMAX; " SO SETTING FMAX = 500 "
  2724. 'FMAX = 500
  2725. 'ELSE
  2726. 'COLOR RED%: PRINT "WARNING !!! FMAX > 500, CAN'T SET FMAX = 500": COLOR GREEN%
  2727. 'END IF
  2728.  
  2729. DELTAT = 1 / (2 * FMAX)
  2730. CALL LEASTDELTA(F(), LDELTAF)
  2731. PRINT "LEAST DELTAF IS "; LDELTAF; " AND 1/LDELTAF IS "; 1 / LDELTAF
  2732. FDELF = (F(1) - F(0)) / 10
  2733. PRINT "FDELF = (F(1) - F(0)) / 10 = "; FDELF; " 1/FDELF = "; 1 / FDELF
  2734. PRINT "FDELTAF = LEASTDELTAF/10 = "; LDELTAF / 10; " 1/(LDELTAF/10) = "; 1 / (LDELTAF / 10)
  2735. INPUT "ENTER THE DELTAF "; DELTAF
  2736.  
  2737. NP = (2 * FMAX / DELTAF)
  2738. PRINT "NP = 2*FMAX/DELTAF = "; NP: INPUT DUM$
  2739.  
  2740. 'TMAX = CINT(TWT(NLAYERS - 1) / DELTAT + 20)           'TMAX IN MILLISECONDS
  2741. 'PTMAX = TMAX
  2742. 'IF TMAX > NP THEN
  2743. 'NP = TMAX
  2744. 'ELSE
  2745. 'TMAX = NP
  2746. 'END IF
  2747.  
  2748. CALL GETPOWEROFTWO(NP, M, NP2)
  2749. DELTAF = 1 / (NP2 * DELTAT)
  2750.  
  2751. A0 = -1 * LOG(.01) / ((NP2 / 4 * DELTAT) ^ 2)
  2752. TAUZERO = (NP2 / 2) * DELTAT
  2753. TIMESHIFT = NP2 / 2
  2754. START% = 0
  2755.  
  2756.  
  2757. PRINT "NP IS "; NP; " NP2 IS "; NP2
  2758. PRINT "FMAX "; FMAX; " DELTAT "; DELTAT; " 1/DELTAT = "; 1 / DELTAT
  2759. PRINT "DELTAF "; DELTAF; " 1/DELTATF = "; 1 / DELTAF
  2760.  
  2761. PRINT "TMAX = "; TMAX
  2762. PRINT "TAUZERO IS "; TAUZERO
  2763.  
  2764. UPPER = NP2
  2765.  
  2766. PRINT "UPPER IS "; UPPER
  2767. INPUT DUM$
  2768. REDIM TIME(START% TO 2 * UPPER)
  2769. REDIM PHASEANGLE(START% TO UPPER)
  2770. REDIM E2(START% TO UPPER), FREQ(START% TO UPPER)
  2771. REDIM RA(START% TO UPPER), IA(START% TO UPPER)
  2772. REDIM OMEGA(START% TO UPPER), FILT(START% TO UPPER)
  2773.  
  2774. FOR I = 0 TO NP2 - 1
  2775. PHASEANGLE(I) = PHI
  2776. NEXT I
  2777.  
  2778. FOR I = 0 TO UPPER - 1
  2779. TIME(I) = I * DELTAT
  2780. NEXT I
  2781. FOR I = 0 TO NP2 - 1
  2782. FREQ(I) = I * DELTAF
  2783. NEXT I
  2784. '*********************
  2785.  
  2786. FOR I = 0 TO NP2 - 1
  2787.  
  2788. IF FREQ(I) < F(0) OR FREQ(I) > F(3) THEN
  2789. FILT(I) = 0
  2790. ELSEIF FREQ(I) < F(1) THEN
  2791. FILT(I) = SIN((2 * PI * (FREQ(I) - F(0))) / (4 * (F(1) - F(0))))
  2792. ELSEIF FREQ(I) <= F(2) THEN
  2793. FILT(I) = 1
  2794. ELSE
  2795. FILT(I) = COS((2 * PI * (FREQ(I) - F(2))) / (4 * (F(3) - F(2))))
  2796. END IF
  2797. NEXT I
  2798. FPOINTS$ = STR$(F(0)) + " " + STR$(F(1)) + " " + STR$(F(2)) + " " + STR$(F(3))
  2799. FTTITLE$ = "BAND PASS FILTER" + FPOINTS$
  2800. FSTITLE$ = "BAND PASS FILTERED SIGNAL " + FPOINTS$
  2801. '*******************************
  2802.  
  2803. FOR I = 0 TO NP2 - 1
  2804. OMEGA(I) = FREQ(I) * 2 * PI
  2805. PHASEANGLE(I) = PHASEANGLE(I) + OMEGA(I) * TAUZERO
  2806. NEXT I
  2807.  
  2808. '******************** e(t) SPIKE O' GRAM
  2809.  
  2810. 'PRINT "TWT(I) IN MILLISECONDS"
  2811. 'FOR I = 1 TO NLAYERS - 1         'CONVERT SECONDS TO INTEGER MILLISECONDS
  2812. 'TWT(I) = TWT(I) * 1 / DELTAT
  2813. 'TWT(I) = CINT(TWT(I))
  2814. 'PRINT TWT(I)
  2815. 'NEXT I
  2816. 'INPUT DUM$
  2817. '********************
  2818. 'FIND E(J(J))
  2819.  
  2820. '*********************** NEW WAY
  2821.  
  2822. REDIM DT(0 TO NLAYERS), DN(0 TO NLAYERS), J(0 TO 1000), E(0 TO 1000)
  2823. FOR I = 1 TO NLAYERS
  2824. DT(I) = H(I) / V(I)
  2825. NEXT I
  2826.  
  2827. COUNT = 1
  2828. FOR I = 1 TO NLAYERS - 1
  2829. TN = H(I) / V(I) * 2
  2830. IF I = 1 THEN
  2831. DN(I) = TN
  2832. ELSE
  2833. DN(I) = DN(I - 1) + TN
  2834. END IF
  2835. J(I) = (DN(I) / DT(I)) + .5
  2836. IF COUNT = 1 THEN
  2837. MAX = J(1)
  2838. ELSEIF J(I) > J(I - 1) THEN
  2839. MAX = J(I) + 1
  2840. END IF
  2841. COUNT = COUNT + 1
  2842. NEXT I
  2843. COUNT = 1
  2844.  
  2845. PRINT "MAX IS "; MAX: INPUT DUM$
  2846. FOR I = 0 TO MAX
  2847. IF I = CINT(J(COUNT)) THEN
  2848. E(I) = REFF(COUNT)
  2849. COUNT = COUNT + 1
  2850. ELSE
  2851. E(I) = 0
  2852. END IF
  2853. NEXT I
  2854.  
  2855.  
  2856.  
  2857. '******************
  2858.  
  2859. 'REDIM J(0 TO UPPER), E(0 TO UPPER)           'TMAX IN MILLISECONDS
  2860. 'TCOUNT = 0: ECOUNT = 1
  2861. 'PRINT "TMAX = "; TMAX
  2862. 'PRINT "I", "J(I)", "E(I)"
  2863. 'FOR I = 0 TO (UPPER - 1)               'IN INTEGER MILLISECONDS
  2864. 'J(I) = I
  2865. 'IF ECOUNT > NLAYERS - 1 THEN : EXIT FOR
  2866. 'IF I = TWT(ECOUNT) THEN
  2867. 'E(I) = REFF(ECOUNT)
  2868. 'ECOUNT = ECOUNT + 1
  2869. ''PRINT "I IS "; I; " E(I) IS "; E(I): INPUT DUM$
  2870. 'IF I = 0 THEN
  2871. 'ECOUNT = ECOUNT - 1
  2872. 'END IF
  2873. 'ELSE
  2874. 'E(I) = 0
  2875. 'END IF
  2876. ''PRINT I, J(I), E(I): INPUT DUM$
  2877. 'NEXT I
  2878. 'ECOUNT = ECOUNT - 1
  2879. 'PRINT "ECOUNT IS "; ECOUNT
  2880. '*******************************************************
  2881. 'FOR I = 1 TO NLAYERS - 1   'CONVERT TWT FROM MILLISECONDS BACK TO SECONDS
  2882. 'TWT(I) = TWT(I) * DELTAT
  2883. 'NEXT I
  2884. '*******************************************************
  2885. 'INPUT "DONE WITH E(T) "; DUM$
  2886.  
  2887. OPEN "E.DUM" FOR OUTPUT AS #10
  2888. 'FOR I = 0 TO UPPER - 1
  2889. 'PRINT #10, I, ",", E(I)
  2890. FOR I = 0 TO MAX
  2891. PRINT #10, E(I)
  2892. NEXT I
  2893. CLOSE #10
  2894.  
  2895. P = UPPER
  2896. CALL GETMINMAX(J(), E(), P, XMIN, XMAX, YMIN, YMAX)
  2897. TITLE$ = "e(t)"
  2898. YTITLE$ = "e(t)"
  2899. XTITLE$ = "t in milliseconds"
  2900. PRINT "J", "E"
  2901.  
  2902. 'XMAX = PTMAX
  2903. INPUT DUM$
  2904. CALL GRAPH(J(), E(), P, XMIN, XMAX, YMIN, YMAX, 0, TITLE$, XTITLE$, YTITLE$)
  2905. '********************
  2906. OUTF = FREEFILE
  2907. OPEN OUTF$ FOR OUTPUT AS #OUTF
  2908. PRINT "V", "H", "RHO", "R", "Reff", "TWT", "J", "E(J)"
  2909. PRINT #OUTF, "V", "H", "RHO", "R", "Reff", "TWT", "J", "E(J)"
  2910. FOR I = 1 TO NLAYERS - 1
  2911. PRINT #OUTF, V(I), ",", H(I), ",", D(I), ",", R(I), ",", REFF(I), ",", TWT(I), ",", J(I), ",", E(I)
  2912. PRINT V(I), H(I), D(I), R(I), REFF(I), TWT(I), J(I), E(I)
  2913. NEXT I
  2914. PRINT #OUTF, V(NLAYERS), ",", H(NLAYERS), ",", D(NLAYERS)
  2915. PRINT V(NLAYERS), H(NLAYERS), D(NLAYERS)
  2916.  
  2917. '******************************
  2918.  
  2919. PRINT "READY TO GRAPH AMPLITUDE  SPECTRUM (THE FILTER)"
  2920. P = NP2
  2921. CALL GETMINMAX(FREQ(), FILT(), P, XMIN, XMAX, YMIN, YMAX)
  2922. T$ = FSTITLE$ + " AMPLITUDE (FILTER)"
  2923. XMAX = FMAX
  2924. CALL GRAPH(FREQ(), FILT(), P, XMIN, XMAX, YMIN, YMAX, 0, T$, "FREQUENCY (w) Hz", "S(w)")
  2925. '************************
  2926.  
  2927. FOR I = 0 TO NP2 - 1  'CONVERT BACK TO RECTANGULAR BEFORE FFT
  2928. RA(I) = FILT(I) * COS(PHASEANGLE(I))
  2929. IA(I) = FILT(I) * (SIN(PHASEANGLE(I))) * -1
  2930. NEXT I
  2931.  
  2932. CALL FFT(NP2, M, RA(), IA())    'SENDING F DOMAIN, WILL RETURN T DOMAIN
  2933.  
  2934. REDIM BELL(0 TO NP2)
  2935. FOR I = 0 TO NP2 - 1
  2936. 'RA(I) = RA(I) * EXP(-1 * A0 * (TIME(I) - TAUZERO) ^ 2)
  2937. TEMP = I * DELTAT
  2938. BELL(I) = EXP(-A0 * (TEMP - TAUZERO) ^ 2)
  2939. RA(I) = RA(I) * BELL(I)
  2940. NEXT I
  2941.  
  2942. P = NP2 - 1
  2943. PRINT "GRAPHING BELL CURVE"
  2944. CALL GETMINMAX(TIME(), BELL(), P, XMIN, XMAX, YMIN, YMAX)
  2945. FSTITLE$ = "BELL CURVE"
  2946. CALL GRAPH(TIME(), BELL(), P, XMIN, XMAX, YMIN, YMAX, 0, FSTITLE$, "TIME (SEC)", "S(t)")
  2947.  
  2948. CALL GETMINMAX(TIME(), RA(), P, XMIN, XMAX, YMIN, YMAX)
  2949. FSTITLE$ = "THE NEW PULSE"
  2950. CALL GRAPH(TIME(), RA(), P, XMIN, XMAX, YMIN, YMAX, 0, FSTITLE$, "TIME (SEC)", "S(t)")
  2951.  
  2952. OPEN "RA.DUM" FOR OUTPUT AS #30
  2953. PRINT #30, "THE PULSE"
  2954. PRINT #30, "I", "TIME", "RA(I)"
  2955. FOR I = 0 TO NP2 - 1
  2956. PRINT #30, I, ",", TIME(I), ",", RA(I)
  2957. NEXT I
  2958. CLOSE #30
  2959.  
  2960. '***********************
  2961. REDIM CON(0 TO UPPER * 2), RAFOLD(0 TO UPPER)      'E2(0 TO NP2)
  2962. REDIM E2(0 TO UPPER), RA2(0 TO UPPER), CONCOUNT(0 TO UPPER * 2)
  2963. FOR I = 0 TO UPPER - 1
  2964. E2(I) = E(I)
  2965. NEXT I
  2966. FOR I = 0 TO NP2 - 1
  2967. RA2(I) = RA(I)
  2968. NEXT I
  2969.  
  2970. CALL FOLDANDSHIFT(NP2, RA(), RAFOLD())
  2971.  
  2972. CT$ = "e(t) * s(t)"
  2973.  
  2974. CALL NEWCONV(TMAX, NP2, E2(), RA2(), RAFOLD(), CON(), CONCOUNT())
  2975. '    NEWCONV (ISNP, IGNP, S(), G(), GF(), CON(), CONCOUNT())
  2976.  
  2977. '*****************************************************************
  2978. PRINT "BACK IN SEISMOGRAM": INPUT DUM$
  2979.  
  2980. FOR I = 0 TO 2 * UPPER - 1
  2981. CONCOUNT(I) = CONCOUNT(I) - TAUZERO * 1000
  2982. NEXT I
  2983.  
  2984. '*****************************************
  2985. PRINT "READY TO GRAPH S(t)"
  2986. P = UPPER
  2987. CALL GETMINMAX(J(), E2(), P, XMIN, XMAX, YMIN, YMAX)
  2988. XMAX = PTMAX
  2989. TITLE$ = "e(t)"
  2990. XTITLE$ = "time (milliseconds)"
  2991. CALL GRAPH(J(), E2(), P, XMIN, XMAX, YMIN, YMAX, 0, TITLE$, XTITLE$, YTITLE$)
  2992.  
  2993. PRINT "READY TO GRAPH THE PULSE"
  2994. P = UPPER
  2995. CALL GETMINMAX(TIME(), RA2(), P, XMIN, XMAX, YMIN, YMAX)
  2996. TITLE$ = "THE PULSE"
  2997. 'YTITLE$ = "g(t)"
  2998. XTITLE$ = "time (milliseconds)"
  2999. CALL GRAPH(TIME(), RA2(), P, XMIN, XMAX, YMIN, YMAX, 0, TITLE$, XTITLE$, YTITLE$)
  3000.  
  3001. PRINT "READY TO GRAPH THE FOLDED SIGNAL"
  3002. P = UPPER
  3003. CALL GETMINMAX(TIME(), RAFOLD(), P, XMIN, XMAX, YMIN, YMAX)
  3004. TITLE$ = "FOLDED PULSE"
  3005. 'YTITLE$ = "G(t) FOLDED"
  3006. XTITLE$ = "time (milliseconds)"
  3007. 'XMAX = PTMAX
  3008. CALL GRAPH(TIME(), RAFOLD(), P, XMIN, XMAX, YMIN, YMAX, 0, TITLE$, XTITLE$, YTITLE$)
  3009.  
  3010.  
  3011. PRINT "READY TO GRAPH THE CONVOLUTION"
  3012. 'LINE INPUT "ENTER THE TITLE "; TITLE$
  3013. TITLE$ = "p(t) = e(t) * s(t)"
  3014. P = UBOUND(CONCOUNT) - LBOUND(CONCOUNT)
  3015. CALL GETMINMAX(CONCOUNT(), CON(), P, XMIN, XMAX, YMIN, YMAX)
  3016. XTITLE$ = "time (milliseconds)"
  3017. XMAX = (UBOUND(CONCOUNT) - LBOUND(CONCOUNT)) / 2
  3018. XMIN = 0
  3019. CALL GRAPH(CONCOUNT(), CON(), P, XMIN, XMAX, YMIN, YMAX, 0, TITLE$, XTITLE$, YTITLE$)
  3020.  
  3021.  
  3022. '********************************************************
  3023. PRINT "WRITING OUTPUT TO "; OUTF$
  3024. PRINT #OUTF, "I", "E(T)", "PULSE()"
  3025. FOR I = 0 TO NP2
  3026. PRINT #OUTF, I, ",", E2(I), ",", RA(I)
  3027. NEXT I
  3028. PRINT #OUTF, "I", "CON()"
  3029. FOR I = LBOUND(CON) TO UBOUND(CON) - 1
  3030. PRINT #OUTF, I, ",", CON(I)
  3031. NEXT I
  3032. CLOSE #OUTF
  3033. ERASE CON, E2, RA, IA, RAFOLD, PHASEANGLE, TIME, OMEGA, FREQ, FILT
  3034. ERASE BELL, V, H, D, R, REFF, TWT, J, E, CONCOUNT, RA2
  3035.  
  3036.  
  3037. END SUB
  3038.  
  3039. SUB SEISMOGRAM (NEWMODEL)
  3040. '***********************  GET E(t)
  3041. DEL$ = CHR$(127)
  3042. PIE$ = CHR$(227)
  3043. PHI$ = CHR$(237)
  3044. RHO$ = CHR$(235)
  3045.  
  3046. NLAYERS = 0:
  3047.  
  3048. PRINT "PHI "; PHI$; " DEL "; DEL$; " PI "; PIE$; " RHO "; RHO$
  3049.  
  3050. IF NEWMODEL THEN
  3051. 'INPUT "ENTER DELTA T IN SECONDS "; DELTAT
  3052. INPUT "ENTER THE NUMBER OF LAYERS INCLUDING THE HALF SPACE "; NLAYERS
  3053. REDIM V(0 TO NLAYERS), H(0 TO NLAYERS), D(0 TO NLAYERS), R(0 TO NLAYERS)
  3054. REDIM REFF(0 TO NLAYERS), TWT(0 TO NLAYERS), J(0 TO NLAYERS + 2)
  3055. REDIM E(0 TO NLAYERS)
  3056.  
  3057. FOR I = 0 TO NLAYERS - 1
  3058. PRINT "FOR LAYER # "; I; : INPUT " ENTER THE VELOCITY  "; V(I)
  3059. INPUT "                            ENTER THE THICKNESS "; H(I)
  3060. INPUT "                            ENTER THE DENSITY   "; D(I)
  3061. NEXT I
  3062. INPUT "FOR THE HALF-SPACE, ENTER THE VELOCITY "; V(NLAYERS)
  3063. INPUT "                    ENTER THE DENSITY  "; D(NLAYERS)
  3064. INPUT "                    THICKNESS (10000)  "; R$
  3065. CALL NIFDEFAULT(R$, H(NLAYERS), 10000)
  3066. ELSE
  3067. PRINT "MODEL DATA FILE NEEDS V,RHO,H (EX.  SM1.DAT)"
  3068. FILES "*.DAT"
  3069. INPUT "ENTER THE FILE NAME OF THE MODEL DATA "; INFMOD$
  3070. INF = FREEFILE
  3071. OPEN INFMOD$ FOR INPUT AS #INF
  3072. INPUT #INF, NLAYERS
  3073. REDIM V(0 TO NLAYERS), H(0 TO NLAYERS), D(0 TO NLAYERS), R(0 TO NLAYERS)
  3074. REDIM REFF(0 TO NLAYERS), TWT(0 TO NLAYERS - 1), J(0 TO NLAYERS)
  3075. REDIM E(0 TO NP2)
  3076.  
  3077. FOR I = 1 TO NLAYERS
  3078. INPUT #INF, V(I), D(I), H(I)
  3079. NEXT I
  3080. CLOSE #INF
  3081. END IF
  3082.  
  3083. INPUT "ENTER OUTPUT FILE NAME "; OUTF$
  3084.  
  3085. INPUT "ENTER ADDITIONAL TITLE "; COMMONTITLE$
  3086. '********************************
  3087. PRINT "NUMBER OF LAYERS "; NLAYERS
  3088. PRINT "V", "RHO", "H"
  3089. FOR I = 1 TO NLAYERS
  3090. PRINT V(I), D(I), H(I)
  3091. NEXT I
  3092.  
  3093. 'FIND REFLECTION COEFFICIENTS
  3094. FOR N = 1 TO NLAYERS - 1
  3095. R(N) = (D(N + 1) * V(N + 1) - D(N) * V(N)) / (D(N + 1) * V(N + 1) + D(N) * V(N))
  3096. NEXT N
  3097.  
  3098. 'FIND THE EFFECTIVE REFLECTION COEFFICIENTS
  3099. FOR N = 1 TO NLAYERS - 1
  3100. PROD = 0: TEMP = 1
  3101. FOR J = 1 TO N - 1
  3102. PROD = 1 - R(J) ^ 2
  3103. TEMP = PROD * TEMP
  3104. NEXT J
  3105. REFF(N) = TEMP * R(N)
  3106. NEXT N
  3107. PRINT "I", "R", "Reff"
  3108. FOR I = 1 TO NLAYERS - 1
  3109. PRINT I, R(I), REFF(I)
  3110. NEXT I
  3111.  
  3112. 'FIND TWO WAY TRAVEL TIMES
  3113. COUNT = 0
  3114. FOR N = 1 TO NLAYERS - 1
  3115. SUM = 0: COUNT = COUNT + 1
  3116. FOR I = 1 TO COUNT
  3117. SUM = H(I) / V(I) * 2 + SUM
  3118. NEXT I
  3119. TWT(N) = SUM
  3120. NEXT N
  3121. PRINT "LAYER", "TWT"
  3122. FOR I = 1 TO NLAYERS - 1
  3123. PRINT I, TWT(I)
  3124. NEXT I
  3125. 'INPUT DUM$
  3126. '*******************     MAKING LOG FILE
  3127. INPUT "APPEND TO LOG FILE SMOD.LOG (Y) "; YN$
  3128. IF YN$ = "" THEN
  3129. YN$ = "Y"
  3130. END IF
  3131. IF YN$ = "Y" THEN
  3132. OL = FREEFILE
  3133. OPEN "SMOD.LOG" FOR APPEND AS #OL
  3134. PRINT #OL, INFMOD$
  3135. PRINT #OL, "V", "RHO", "H"
  3136. FOR I = 1 TO NLAYERS
  3137. PRINT #OL, V(I), ",", D(I), ",", H(I)
  3138. NEXT I
  3139.  
  3140. PRINT #OL, "R", "Reff", "TWT(sec)", "TWT(msec)"
  3141. FOR N = 1 TO NLAYERS - 1
  3142. PRINT #OL, R(N), ",", REFF(N), ",", TWT(N), ",", TWT(N) * 1000
  3143. NEXT N
  3144. PRINT #OL, ""
  3145. CLOSE #OL
  3146. END IF
  3147.  
  3148. '******************************* BP FILTER
  3149. REDIM F(0 TO 3)
  3150. DO
  3151. PRINT "ENTER THE BAND FILTER PARAMETERS"
  3152. PRINT "(1) SM1.DAT USES 60, 90, 120, 175"
  3153. PRINT "(2) SM2.DAT USES 30, 60, 100, 200"
  3154. PRINT "(3) SM2.DAT USEING 20, 40, 50, 100"
  3155. PRINT
  3156. PRINT "(4) INPUT BAND PASS FILTER "
  3157. INPUT CHOICE%
  3158. LOOP WHILE CHOICE% < 1 OR CHOICE% > 4
  3159. SELECT CASE CHOICE%
  3160. CASE 1:
  3161. F(0) = 60: F(1) = 90: F(2) = 120: F(3) = 175         'SM1
  3162. CASE 2:
  3163. F(0) = 30: F(1) = 60: F(2) = 100: F(3) = 200          'SM2
  3164. CASE 3:
  3165. F(0) = 20: F(1) = 40: F(2) = 50: F(3) = 100
  3166. CASE 4:
  3167. INPUT "F0 IS "; F(0)
  3168. INPUT "F1 IS "; F(1)
  3169. INPUT "F2 IS "; F(2)
  3170. INPUT "F3 IS "; F(3)
  3171. END SELECT
  3172.  
  3173.  
  3174. PRINT "ENTER A PHASE (0, "; PIE$; "/2, "; PIE$; ")"
  3175. PRINT "ENTER A PHASE ("; PIE$; "/2) ": INPUT R$: CALL NIFDEFAULT(R$, PHI, 1.57)
  3176. PRINT "PHASE IS "; PHI
  3177. FMAX = 2 * F(3)
  3178. IF FMAX < 500 THEN
  3179. PRINT "FMAX = "; FMAX; " SO SETTING FMAX = 500 "
  3180. FMAX = 500
  3181. ELSE
  3182. COLOR RED%: PRINT "WARNING !!! FMAX > 500, CAN'T SET FMAX = 500"
  3183. PRINT "FMAX WILL BE SET TO "; FMAX
  3184. END IF
  3185.  
  3186. DELTAT = 1 / (2 * FMAX)
  3187. CALL LEASTDELTA(F(), DELTAF)
  3188. PRINT "LEAST DELTAF IS "; DELTAF; " AND 1/DELTAF IS "; 1 / DELTAF
  3189. NP = (2 * FMAX / DELTAF)
  3190. TMAX = CINT(TWT(NLAYERS - 1) / DELTAT + 20)           'TMAX IN MILLISECONDS
  3191. PTMAX = TMAX
  3192. IF TMAX > NP THEN
  3193. NP = TMAX
  3194. ELSE
  3195. TMAX = NP
  3196. END IF
  3197.  
  3198. CALL GETPOWEROFTWO(NP, M, NP2)
  3199. DELTAF = 1 / (NP2 * DELTAT)
  3200.  
  3201. A0 = -1 * LOG(.01) / ((NP2 / 4 * DELTAT) ^ 2)
  3202. 'TAUZERO = (NP2 / 2) * DELTAT
  3203. 'TAUZERO = NP * DELTAT
  3204. TAUZERO = (NP2 - 1 - NP) * DELTAT
  3205. TIMESHIFT = NP2 / 2
  3206. START% = 0
  3207.  
  3208.  
  3209. PRINT "NP IS "; NP; " NP2 IS "; NP2
  3210. PRINT "FMAX "; FMAX; " DELTAT "; DELTAT; " 1/DELTAT = "; 1 / DELTAT
  3211. PRINT "DELTAF "; DELTAF; " 1/DELTATF = "; 1 / DELTAF
  3212.  
  3213. PRINT "TMAX = "; TMAX
  3214. PRINT "TAUZERO IS "; TAUZERO
  3215.  
  3216. UPPER = NP2
  3217. PRINT "UPPER IS "; UPPER
  3218. INPUT DUM$
  3219. REDIM TIME(START% TO 2 * UPPER)
  3220. REDIM PHASEANGLE(START% TO UPPER)
  3221. REDIM E2(START% TO UPPER), FREQ(START% TO UPPER)
  3222. REDIM RA(START% TO UPPER), IA(START% TO UPPER)
  3223. REDIM OMEGA(START% TO UPPER), FILT(START% TO UPPER)
  3224.  
  3225. FOR I = 0 TO NP2 - 1
  3226. PHASEANGLE(I) = PHI
  3227. NEXT I
  3228.  
  3229. FOR I = 0 TO UPPER - 1
  3230. TIME(I) = I * DELTAT
  3231. NEXT I
  3232. FOR I = 0 TO NP2 - 1
  3233. FREQ(I) = I * DELTAF
  3234. NEXT I
  3235. '*********************
  3236.  
  3237. FOR I = 0 TO NP2 - 1
  3238.  
  3239. IF FREQ(I) < F(0) OR FREQ(I) > F(3) THEN
  3240. FILT(I) = 0
  3241. ELSEIF FREQ(I) < F(1) THEN
  3242. FILT(I) = SIN((2 * PI * (FREQ(I) - F(0))) / (4 * (F(1) - F(0))))
  3243. ELSEIF FREQ(I) <= F(2) THEN
  3244. FILT(I) = 1
  3245. ELSE
  3246. FILT(I) = COS((2 * PI * (FREQ(I) - F(2))) / (4 * (F(3) - F(2))))
  3247. END IF
  3248. NEXT I
  3249. FPOINTS$ = STR$(F(0)) + " " + STR$(F(1)) + " " + STR$(F(2)) + " " + STR$(F(3))
  3250. FTTITLE$ = "BAND PASS FILTER" + FPOINTS$
  3251. FSTITLE$ = "BAND PASS FILTERED SIGNAL " + FPOINTS$
  3252. '*********************************
  3253. FOR I = 0 TO NP2 - 1
  3254. OMEGA(I) = FREQ(I) * 2 * PI
  3255. PHASEANGLE(I) = PHASEANGLE(I) + OMEGA(I) * TAUZERO
  3256. NEXT I
  3257.  
  3258. '******************** e(t) SPIKE O' GRAM
  3259.  
  3260. PRINT "TWT(I) IN MILLISECONDS"
  3261. FOR I = 1 TO NLAYERS - 1         'CONVERT SECONDS TO INTEGER MILLISECONDS
  3262. TWT(I) = TWT(I) * 1 / DELTAT
  3263. TWT(I) = CINT(TWT(I))
  3264. PRINT TWT(I)
  3265. NEXT I
  3266. INPUT DUM$
  3267. '********************
  3268. 'FIND E(J(J))
  3269.  
  3270. REDIM TSCALE(0 TO UPPER), E(0 TO UPPER)       'TMAX IN MILLISECONDS
  3271. TCOUNT = 0: ECOUNT = 1
  3272. PRINT "TMAX = "; TMAX
  3273. PRINT "I", "TSCALE(I)", "E(I)"
  3274. FOR I = 0 TO (UPPER - 1)             'IN INTEGER MILLISECONDS
  3275. TSCALE(I) = I
  3276. IF ECOUNT > NLAYERS - 1 THEN : EXIT FOR
  3277. IF I = TWT(ECOUNT) THEN
  3278. E(I) = REFF(ECOUNT)
  3279. ECOUNT = ECOUNT + 1
  3280. 'PRINT "I IS "; I; " E(I) IS "; E(I): INPUT DUM$
  3281. IF I = 0 THEN
  3282. ECOUNT = ECOUNT - 1
  3283. END IF
  3284. ELSE
  3285. E(I) = 0
  3286. END IF
  3287. 'PRINT I, TSCALE(I), E(I): INPUT DUM$
  3288. NEXT I
  3289. ECOUNT = ECOUNT - 1
  3290. PRINT "ECOUNT IS "; ECOUNT
  3291. '*******************************************************
  3292. FOR I = 1 TO NLAYERS - 1   'CONVERT TWT FROM MILLISECONDS BACK TO SECONDS
  3293. TWT(I) = TWT(I) * DELTAT
  3294. NEXT I
  3295. '*******************************************************
  3296. 'INPUT "DONE WITH E(T) "; DUM$
  3297.  
  3298. P = UPPER
  3299. CALL GETMINMAX(TSCALE(), E(), P, XMIN, XMAX, YMIN, YMAX)
  3300. TITLE$ = "e(t)"
  3301. YTITLE$ = "e(t)"
  3302. XTITLE$ = "t in milliseconds"
  3303. PRINT "J", "E"
  3304. XMAX = PTMAX
  3305. CALL GRAPH(TSCALE(), E(), P, XMIN, XMAX, YMIN, YMAX, 0, TITLE$, XTITLE$, YTITLE$)
  3306. '********************
  3307. OUTF = FREEFILE
  3308. OPEN OUTF$ FOR OUTPUT AS #OUTF
  3309. PRINT "V", "H", "RHO", "R", "Reff", "TWT", "J", "E(J)"
  3310. PRINT #OUTF, "V", "H", "RHO", "R", "Reff", "TWT", "J", "E(J)"
  3311. FOR I = 1 TO NLAYERS - 1
  3312. PRINT #OUTF, V(I), ",", H(I), ",", D(I), ",", R(I), ",", REFF(I), ",", TWT(I), ",", J(I), ",", E(I)
  3313. PRINT V(I), H(I), D(I), R(I), REFF(I), TWT(I), J(I), E(I)
  3314. NEXT I
  3315. PRINT #OUTF, V(NLAYERS), ",", H(NLAYERS), ",", D(NLAYERS)
  3316. PRINT V(NLAYERS), H(NLAYERS), D(NLAYERS)
  3317.  
  3318. '******************************
  3319.  
  3320. PRINT "READY TO GRAPH AMPLITUDE  SPECTRUM (THE FILTER)"
  3321. P = NP2
  3322. CALL GETMINMAX(FREQ(), FILT(), P, XMIN, XMAX, YMIN, YMAX)
  3323. T$ = FSTITLE$ + " AMPLITUDE (FILTER)"
  3324. XMAX = FMAX
  3325. CALL GRAPH(FREQ(), FILT(), P, XMIN, XMAX, YMIN, YMAX, 0, T$, "FREQUENCY (w) Hz", "S(w)")
  3326. '************************
  3327.  
  3328. FOR I = 0 TO NP2 - 1  'CONVERT BACK TO RECTANGULAR BEFORE FFT
  3329. RA(I) = FILT(I) * COS(PHASEANGLE(I))
  3330. IA(I) = FILT(I) * (SIN(PHASEANGLE(I))) * -1
  3331. NEXT I
  3332.  
  3333. CALL FFT(NP2, M, RA(), IA())    'SENDING F DOMAIN, WILL RETURN T DOMAIN
  3334.  
  3335. REDIM BELL(0 TO NP2)
  3336. FOR I = 0 TO NP2 - 1
  3337. 'RA(I) = RA(I) * EXP(-1 * A0 * (TIME(I) - TAUZERO) ^ 2)
  3338. TEMP = I * DELTAT
  3339. BELL(I) = EXP(-A0 * (TEMP - TAUZERO) ^ 2)
  3340. RA(I) = RA(I) * BELL(I)
  3341. NEXT I
  3342.  
  3343. P = NP2 - 1
  3344. PRINT "GRAPHING BELL CURVE"
  3345. CALL GETMINMAX(TIME(), BELL(), P, XMIN, XMAX, YMIN, YMAX)
  3346. FSTITLE$ = "BELL CURVE"
  3347. CALL GRAPH(TIME(), BELL(), P, XMIN, XMAX, YMIN, YMAX, 0, FSTITLE$, "TIME (SEC)", "S(t)")
  3348.  
  3349. CALL GETMINMAX(TIME(), RA(), P, XMIN, XMAX, YMIN, YMAX)
  3350. FSTITLE$ = "THE NEW PULSE"
  3351. CALL GRAPH(TIME(), RA(), P, XMIN, XMAX, YMIN, YMAX, 0, FSTITLE$, "TIME (SEC)", "S(t)")
  3352.  
  3353. '***********************
  3354. REDIM CON(0 TO UPPER * 2), RAFOLD(0 TO UPPER)      'E2(0 TO NP2)
  3355. REDIM E2(0 TO UPPER), RA2(0 TO UPPER), CONCOUNT(0 TO UPPER * 2)
  3356. FOR I = 0 TO UPPER - 1
  3357. E2(I) = E(I)
  3358. NEXT I
  3359. FOR I = 0 TO NP2 - 1
  3360. RA2(I) = RA(I)
  3361. NEXT I
  3362.  
  3363. CALL FOLDANDSHIFT(NP2, RA(), RAFOLD())
  3364. CT$ = "e(t) * s(t)"
  3365.  
  3366. CALL NEWCONV(TMAX, NP2, E2(), RA2(), RAFOLD(), CON(), CONCOUNT())
  3367. '    NEWCONV (ISNP, IGNP, S(), G(), GF(), CON(), CONCOUNT())
  3368.  
  3369. '*****************************************************************
  3370. PRINT "TAUZERO IS "; TAUZERO
  3371. PRINT "BACK IN SEISMOGRAM": INPUT DUM$
  3372. TAUZERO = TAUZERO - DELTAT
  3373. FOR I = 0 TO 2 * UPPER - 1
  3374. CONCOUNT(I) = CINT(CONCOUNT(I) - TAUZERO * 1 / DELTAT)
  3375. NEXT I
  3376. TAUZERO = CINT(TAUZERO * 1 / DELTAT)
  3377. '*****************************************
  3378. PRINT "READY TO GRAPH S(t)"
  3379. P = UPPER
  3380. CALL GETMINMAX(TSCALE(), E2(), P, XMIN, XMAX, YMIN, YMAX)
  3381. XMAX = PTMAX
  3382. TITLE$ = "e(t)" + FPOINTS$
  3383. XTITLE$ = "time (milliseconds)"
  3384. CALL GRAPH(TSCALE(), E2(), P, XMIN, XMAX, YMIN, YMAX, 0, TITLE$, XTITLE$, YTITLE$)
  3385.  
  3386. PRINT "READY TO GRAPH THE PULSE"
  3387. P = UPPER
  3388. CALL GETMINMAX(TIME(), RA2(), P, XMIN, XMAX, YMIN, YMAX)
  3389. TITLE$ = "THE PULSE" + FPOINTS$
  3390. 'YTITLE$ = "g(t)"
  3391. XTITLE$ = "time (milliseconds)"
  3392. CALL GRAPH(TIME(), RA2(), P, XMIN, XMAX, YMIN, YMAX, 0, TITLE$, XTITLE$, YTITLE$)
  3393.  
  3394. PRINT "READY TO GRAPH THE FOLDED SIGNAL"
  3395. P = UPPER
  3396. CALL GETMINMAX(TIME(), RAFOLD(), P, XMIN, XMAX, YMIN, YMAX)
  3397. TITLE$ = "FOLDED PULSE" + FPOINTS$
  3398. 'YTITLE$ = "G(t) FOLDED"
  3399. XTITLE$ = "time (milliseconds)"
  3400. 'XMAX = PTMAX
  3401. CALL GRAPH(TIME(), RAFOLD(), P, XMIN, XMAX, YMIN, YMAX, 0, TITLE$, XTITLE$, YTITLE$)
  3402.  
  3403.  
  3404. PRINT "READY TO GRAPH THE CONVOLUTION"
  3405. 'LINE INPUT "ENTER THE TITLE "; TITLE$
  3406. TITLE$ = "p(t) = e(t) * s(t) " + FPOINTS$
  3407. P = UBOUND(CONCOUNT) - LBOUND(CONCOUNT)
  3408. CALL GETMINMAX(CONCOUNT(), CON(), P, XMIN, XMAX, YMIN, YMAX)
  3409. XTITLE$ = "time (milliseconds)"
  3410. XMAX = (UBOUND(CONCOUNT) - LBOUND(CONCOUNT)) / 2
  3411. PRINT "XMAX "; XMAX
  3412. 'XMIN = 0
  3413. XMIN = CONCOUNT(TAUZERO)
  3414. CALL GRAPH(CONCOUNT(), CON(), P, XMIN, XMAX, YMIN, YMAX, 0, TITLE$, XTITLE$, YTITLE$)
  3415.  
  3416.  
  3417. '********************************************************
  3418. PRINT "WRITING OUTPUT TO "; OUTF$
  3419. PRINT #OUTF, "I", "E(T)", "PULSE()"
  3420. FOR I = 0 TO NP2
  3421. PRINT #OUTF, I, ",", E2(I), ",", RA(I)
  3422. NEXT I
  3423. PRINT #OUTF, "I", "CONCOUNT", "CON()"
  3424. FOR I = LBOUND(CON) TO UBOUND(CON) - 1
  3425. PRINT #OUTF, I, ",", CONCOUNT(I), ",", CON(I)
  3426. NEXT I
  3427. CLOSE #OUTF
  3428. ERASE CON, E2, RA, IA, RAFOLD, PHASEANGLE, TIME, OMEGA, FREQ, FILT
  3429. ERASE BELL, V, H, D, R, REFF, TWT, J, E, CONCOUNT, RA2
  3430.  
  3431. END SUB
  3432.  
  3433. SUB SEISMOGRAMMENU
  3434. 'ARTIFICIAL SEISMOGRAM
  3435. DO
  3436. COLOR 2
  3437.         'DISPLAY MENU
  3438. CLS 0
  3439. PRINT "ARTIFICIAL SEISMOGRAM"
  3440. PRINT ""
  3441. PRINT "         (1) ENTER A NEW MODEL"
  3442. PRINT "         (2) INPUT A PREVIOUS MODEL"
  3443. PRINT "         (3) "
  3444. PRINT "         (4)"
  3445. PRINT ""
  3446. PRINT "         (5) EXIT TO DOS SHELL (TYPE 'EXIT' TO RETURN TO PROGRAM)"
  3447. PRINT ""
  3448. PRINT "         (6) CONVOLUTION"
  3449. PRINT
  3450. PRINT "         (7)"
  3451. PRINT ""
  3452. PRINT "         (8) VER 2. ENTER A NEW MODEL"
  3453. PRINT ""
  3454. PRINT "         (9) VER 2. INPUT A MODEL"
  3455. PRINT
  3456. PRINT "        (10) QUIT THIS MENU"
  3457. INPUT "ENTER A NUMBER TO INDICATE YOUR CHOICE "; CHOICE%
  3458. PRINT ""
  3459. 'RESPOND TO CHOICE
  3460. SELECT CASE CHOICE%
  3461.         CASE 1:
  3462.         'INPUT A NEW MODEL
  3463.             NEWMODEL = TRUE
  3464.             CALL SEISMOGRAM(NEWMODEL)
  3465.         CASE 2:
  3466.         'INPUT AN EXISTING MODEL
  3467.         CALL SEISMOGRAM(NEWMODEL)
  3468.  
  3469.         CASE 3:
  3470.      
  3471.         CASE 4:
  3472.     
  3473.                
  3474.  
  3475.      
  3476.         CASE 5: COLOR 9
  3477.         PRINT "TYPE EXIT TO RETURN TO PROGRAM"
  3478.                 SHELL
  3479.                 COLOR 2
  3480.   
  3481.         CASE 6:  CALL NEWCONVOLUTION
  3482.                 
  3483.  
  3484.         CASE 7:
  3485.  
  3486.         CASE 8:
  3487.         'INPUT A NEW MODEL
  3488.             NEWMODEL = TRUE
  3489.             CALL SEISMO2(NEWMODEL)
  3490.  
  3491.        
  3492.      
  3493.         CASE 9:
  3494.         'INPUT AN EXISTING MODEL
  3495.         CALL SEISMO2(NEWMODEL)
  3496.      
  3497.      
  3498.         CASE 10: DONE = TRUE
  3499.                 
  3500.            
  3501. END SELECT       'SELECT CASE CHOICE
  3502. LOOP UNTIL DONE
  3503.  
  3504.  
  3505.  
  3506.  
  3507. END SUB
  3508.  
  3509. SUB SINCLPF (NP, DELT, F())
  3510. PRINT "LOW PASS FILTER BY CONVOLUTION"
  3511. INPUT "ENTER F0 (40) "; R$: CALL NIFDEFAULT(R$, F0, 40)
  3512. OUF = FREEFILE
  3513. OPEN "F40SINC.DAT" FOR OUTPUT AS #OUF
  3514.  
  3515. REDIM FCOUNT(0 TO 2 * NP)
  3516. F(0) = 0
  3517. K = 0
  3518. DT = 0
  3519. FOR I = DELT * -(NP / 2) TO DELT * ((NP / 2)) STEP DELT
  3520. DT = I
  3521. IF DT <> 0 THEN
  3522. F(K) = 2 * F0 * SIN(2 * PI * F0 * DT) / (2 * PI * F0 * DT)
  3523. ELSE
  3524. F(K) = 2 * F0
  3525. END IF
  3526. PRINT #OUF, F(K)
  3527. FCOUNT(K) = K
  3528. K = K + 1
  3529. NEXT I
  3530. CLOSE #OUF
  3531. FTOTAL = K
  3532. CALL GETMINMAX(FCOUNT(), F(), FTOTAL, XMIN, XMAX, YMIN, YMAX)
  3533. TITLE$ = "f(t)"
  3534. YTITLE$ = "f(t)"
  3535. XTITLE$ = "t  DELTAT = " + STR$(DELT)
  3536. CALL GRAPH(FCOUNT(), F(), FTOTAL, XMIN, XMAX, YMIN, YMAX, 0, TITLE$, XTITLE$, YTITLE$)
  3537. ERASE FCOUNT
  3538. END SUB
  3539.  
  3540. SUB WAITFORKEY
  3541. DO: LOOP UNTIL INKEY$ <> ""
  3542. END SUB
  3543.  
  3544.